问答题 使用散列函数:
H(k)=3k mod 11
并采用开放地址法处理冲突,所求下一地址函数为
d1=H(k)
di=(di-1+((7k mod 10)+1)%11(i=2,3,…)
试在0~10的散列地址空间中对关键字序列(22,41,53,46,30,13,01,67)构造哈希表,求等概率情况下查找成功的平均查找长度,并设计构造哈希表的完整的算法。
【正确答案】本题的哈希表构造过程如下: (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; } } }
【答案解析】