题目:
使用闭散列方法,利用双散列方法解决冲突,把下面的关键码插人到一个有13个槽的散列表中
(槽从0到12编号)。使用的散列函数H1和H2在下面定义。给出插人8个关键码值后的散列
表。一定要说明如何使用H1和H2进行散列。函数Rev(h)颠倒十进制数k的各个位的数字,例
如Rev(37) =73; Rev(7) =7。
H1(k) =k mod 13。
H2(h) =( Rev(k+1) mod 11)。
关键码: 2、8、31、20、19、18、53、27。
最后结果:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
53 | 2 | 27 | 31 | 19 | 20 | 8 | 18 |
过程:
- 算出两个散列函数
Key | 2 | 8 | 31 | 20 | 19 | 18 | 53 | 27 |
---|---|---|---|---|---|---|---|---|
h1(k) | 2 | 8 | 5 | 7 | 6 | 5 | 1 | 1 |
h2(k) | 3 | 9 | 1 | 1 | 2 | 3 | 1 | 5 |
其中,18和27散列后的值与前面的槽相同,发生聚集
- 进行散列
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
53 | 2 | 31 | 19 | 20 | 8 |
①先把不冲突的放入对应槽中
②冲突的:
18:h1(k)+1h2(k)=8,第8号槽非空,继续探查
h1(k)+1h2(k)=11,第11号槽空,放入第11号槽
27:h1(k)+1h2(k)=6,第6号槽非空,继续探查
h1(k)+2h2(k)=11,第11号槽非空,继续探查
h1(k)+2*h2(k)=16,16%13=3,第3号槽空,放入第3号槽
于是得出答案如上。