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);
}
}