数据结构 第七章 查找 作业

判断题

1-1
将M个元素存入用长度为S的数组表示的散列表,则该表的装填因子为M/S。

T F

散列表的装填因子=表中填入的记录数/散列表的长度

1-2
即使把2个元素散列到有100个单元的表中,仍然有可能发生冲突。

T F

本题主要是考察散列(hash)函数是可以改变的,冲突的选择是根据函数的选取

1-3
将 10 个元素散列到 100 000 个单元的哈希表中,一定不会产生冲突。

T F

由于散列函数的选取,仍然有可能产生地址冲突,冲突不能绝对地避免

单选题

2-1
已知一个长度为16的顺序表L,其元素按关键字有序排列。若采用二分查找法查找一个L中不存在的元素,则关键字的比较次数最多是:

A. 4
B. 5
C. 6
D. 7

2-2
用二分查找从100个有序整数中查找某数,最坏情况下需要比较的次数是:

A. 7
B. 10
C. 50
D. 99

二分查找的最大比较次数是
在这里插入图片描述

2-3
在下列查找的方法中,平均查找长度与结点个数无关的查找方法是:

A. 顺序查找
B. 二分法
C. 利用哈希(散列)表
D. 利用二叉搜索树

散列表查找法的特点是平均查找长度与结点个数n无关

2-4
将10个元素散列到100000个单元的哈希表中,是否一定产生冲突?

A. 一定会
B. 可能会
C. 一定不会
D. 有万分之一的可能会

2-5
设散列表的地址区间为[0,16],散列函数为H(Key)=Key%17。采用线性探测法处理冲突,并将关键字序列{ 26,25,72,38,8,18,59 }依次存储到散列表中。元素59存放在散列表中的地址是:

A. 8
B. 9
C. 10
D. 11

2-6
从一个具有N个结点的单链表中查找其值等于X的结点时,在查找成功的情况下,需平均比较多少个结点?

A. N/2
B. N
C. (N−1)/2
D. (N+1)/2

从一个具bai有n个节点的单链表中查找其值du等于x的节点,在查找成功的zhi情况下,平均需要比较dao(n+1)/2个节点。
由于单链表只能进行单向顺序查找,以从第一个节点开始查找为例,查找第m个节点需要比较的节点数f(m)=m,查找成功的最好情况是第一次就查找成功,只用比较1个节点,最坏情况则是最后才查找成功,需要比较n个节点。
所以一共有n种情况,平均下来需要比较的节点为(1+2+3+…+(n-1)+n)/n=(n+1)/2。

2-7
对一个长度为 10 的排好序的表用二分法查找,若查找不成功,至少需要比较的次数是()。

A. 4
B. 3
C. 5
D. 6

编程题

7-1 航空公司VIP客户查询 (25分)

不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务。现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分的功能。

输入格式:
输入首先给出两个正整数N(≤10^​5)和K(≤500)。其中K是最低里程,即为照顾乘坐短程航班的会员,航空公司还会将航程低于K公里的航班也按K公里累积。随后N行,每行给出一条飞行记录。飞行记录的输入格式为:18位身份证号码(空格)飞行里程。其中身份证号码由17位数字加最后一位校验码组成,校验码的取值范围为0~9和x共11个符号;飞行里程单位为公里,是(0, 15 000]区间内的整数。然后给出一个正整数M(≤10^​5),随后给出M行查询人的身份证号码。

输出格式:
对每个查询人,给出其当前的里程累积值。如果该人不是会员,则输出No Info。每个查询结果占一行。

输入样例:

4 500
330106199010080419 499
110108198403100012 15000
120104195510156021 800
330106199010080419 1
4
120104195510156021
110108198403100012
330106199010080419
33010619901008041x

输出样例:

800
15000
1000
No Info
#include
#include
#include
#include
using namespace std;
#define MAXN 10005
typedef long long LL;
/*
hash表
*/

typedef struct node
{
    char id[20];
    LL miles;
    struct node* next;
}*List;
typedef struct tb
{
    LL Tablesize;
    List *list;
}*Hashlist;
LL Hash(char key[],LL size)
{
    LL tmp = 0;
    for(LL i=13;i<18;i++)
    {
        if(key[i]=='x')
            tmp = (tmp*10+10)%size;
        else
            tmp = (tmp*10 + key[i]-'0')%size;
    }
    return tmp;
}
LL NextPrim(LL x)
{
    LL j;
    for(LL i=x;;i++)
    {
        for(j=2;j*j<=i;j++)
            if(i%j==0)
                break;
        if(j*j>i)
            return i;
    }
}
Hashlist Init(LL size)
{
    Hashlist H = (Hashlist)malloc(sizeof(tb));
    H->Tablesize = NextPrim(size);
    H->list = (List*)malloc(sizeof(List)*H->Tablesize);
    for(LL i=0;i<H->Tablesize;i++)
    {
        H->list[i] = (List)malloc(sizeof(node));
        H->list[i]->next = NULL;
    }
    return H;
}
List Find(char key[],Hashlist H)
{
    List t = H->list[Hash(key,H->Tablesize)];
    List p = t->next;
    while(p!=NULL && strcmp(key,p->id))
        p = p->next;
    return p;
}
void Insert(char key[],LL miles,Hashlist H)
{
    List t = H->list[Hash(key,H->Tablesize)];
    List f = Find(key,H);
    if(f==NULL)
    {
        List tmp = (List)malloc(sizeof(node));
        tmp->miles = miles;
        strcpy(tmp->id,key);
        tmp->next = t->next;
        t->next = tmp;
    }
    else
    {
        (f->miles) += miles;
    }
}

int main()
{
    char id[20];
    LL tmp,n,m,k;
    scanf("%lld%lld",&n,&k);
    Hashlist H = Init(n);
    for(LL i=0;i<n;i++)
    {
        scanf("%s%lld",id,&tmp);
        if(tmp<k) tmp = k;
        Insert(id,tmp,H);
    }
    scanf("%lld",&m);
    for(LL j=0;j<m;j++)
    {
        scanf("%s",id);
        List f = Find(id,H);
        if(f==NULL)
            printf("No Info\n");
        else
            printf("%lld\n",f->miles);
    }
}

你可能感兴趣的:(数据结构)