【正确答案】本题的哈希表构造过程如下:
(1)H(22)=3*22 mod 11=0比较1次
(2)H(41)=3*41 mod 11=2比较1次
(3)H(53)=3*53 mod 11=5比较1次
(4)H(46)=3*46 mod 11=6比较1次
(5)H(30)=3*30 mod 11=2冲突
d1=H(30)=2
H(30)=(2+(7*30 mod 10)+1)mod 11=3比较2次
(6)H(13)=3*13 mod 11=6冲突
d1=H(13)=6
H(13)=(6+(7*13 mod 10)+1)mod 11=8比较2次
(7)H(1)=3*01 mod 11=3冲突
d1=H(1)=3
H(1)=(3+(1*7 mod 10)+1)mod 11=0冲突
d2=H(1)=0
H(1)=(0+(1*7 mod 10)+1)mod 11=8冲突
d3=H(1)=8
H(1)=(8+(1*7 mod 10)+1)mod 11=5冲突
d4=H(1)=5
H(1)=(5+(1*7 mod 10)+1)mod 11=2冲突
d5=H(1)=2
H(1)=(2+(1*7 mod 10)+1)mod 11=10比较6次
(8)H(67)=3*67 mod 11=3冲突
d1=H(67)=3
H(67)=(3+(7*67 mod 10)+1)mod 11=2冲突
d2=H(67)=2
H(67)=(2+(7*67 mod 10)+1)mod 11=1比较3次
[*]
构造本哈希表的程序代码如下:
struct hterm
{
int key; //关键字值
int si; //散列次数
};
struct hterm hlist[M]; //假设M=11是已定义的常量
int i,adr,sum,d;
int x[N]={22,41,53,46,30,13,1,67}; //关键字赋值
//假设N=8是已定义的常量
float average;
void chash() //创建哈希表
{
for(i=0;i<M;++i) //置初值
{
hlist[i].key=0;
hlist[i].si=0;
}
for(i=0;i<N;++i)
{
sum=0;
adr=(3*x[i]) % M;
d=adr;
if(hlist[adr].key==0)
{
hlist[adr].key=x[i];
hlist[adr].si=1;
}
else
{
do //处理冲突
{
d=(d+(x[i]*7) % 10+1) % M;
sum=sum+1;
} while(hlist[d].key!=0);
hlist[d].key=x[i];
hlist[d].si=sum+1;
}
}
}
【答案解析】