数据结构 第七章 查找 作业(已批改)

判断题

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

T F

课本P226:散列表的装填因子 α 定义为 =表中填入的记录数 / 散列表的长度;

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

T F

本题主要是考察散列(hash)函数是可以改变的,冲突的选择是根据函数的选取;
课本P223:选择一个“好”的散列函数可以在一定程度上减少冲突,但在实际应用中,很难完全避免发生冲突,所以选择一个有效的处理冲突的方法是散列法的另一个关键问题;

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

T F

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

单选题

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

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

二分查找的最大比较次数是
在这里插入图片描述
log(16) + 1 = 4 + 1 = 5;

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

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

二分查找的最大比较次数是
在这里插入图片描述
2 ^ 6 = 64;
log(100) + 1 = 6 + 1 = 7;

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

课本P223:线性探测法:这种探测方法可以将散列表假想成一个循环表,发生冲突时,从冲突地址的下一单元顺序寻找空单元,如果到最后一个位置也没找到空单元,则回到表头开始继续查找,直到找到一个空位,就把此元素放入此空位中。如果找不到空位,则说明散列表已满,需要进行溢出处理。
过程:
26 % 17 = 9,所以地址9存放26;
25 % 17 = 8,所以地址8存放25;
72 % 17 = 4,所以地址4存放72;
38 % 17 = 4,因为地址4冲突,往下移动一个单元,所以地址5存放38;
8 % 17 = 8,因为地址8冲突,往下移动一个单元,又因为地址9冲突,往下移动一个单元,所以地址10存放8;
18 % 17 = 1,所以地址1存放18;
59 % 17 = 8,因为地址8冲突,往下移动一个单元,又因为地址9冲突,往下移动一个单元,又又因为地址10冲突,往下移动一个单元,所以地址11存放59;

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

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

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

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<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
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);
    }
}

猜你喜欢

转载自blog.csdn.net/Jessieeeeeee/article/details/107029762