结构推理 按α=0.5把关键码集合016,087,154,170,275,426,503,509,512,612,653,677,703,765,897,908存入一个散列表中,试设计两种散列函数,分别算出每个关键码对应的地址,看有多少次碰撞发生。选用上面设计的一种散列函数对上述关键码集合进行存储,用开地址线性探杏法解决碰撞,将所有关键码都进入散列表后的存储状况画出来。
【正确答案】①除余法:模取31。
key H(key)
016 16
087 25
154 30
170 15
275 27
426 23
503 7
509 13
512 16
612 23
653 2
677 26
703 21
765 21
897 29
908 9

   碰撞次数:3。
   ②基数转换法:首先对关键码进行基数转换,把原关键码看成是十三进制数,转换成十进制数,然后对转换后的数进行折叠相加:个位一段,十位一段,百位、千位合为一段,然后将3段相加。
key key' H(key)
016 19 10
087 111 3
154 238 13
170 260 8
275 434 11
426 708 15
503 848 20
509 854 17
512 860 14
612 1029 21
653 1082 20
677 1112 14
703 1186 25
765 1266 24
897 1476 27
908 1529 26

   碰撞次数:2。
   (2)用除余法做散列函数,用线性探索法处理碰撞,建立的散列表结果如下:
地 址 关键码
0  
1  
2 653
3  
4  
5  
6  
7 503
8  
9 908
10  
11  
12  
13 509
14  
15 170
16 016
17 512
18  
19  
20  
21 703
22 765
23 426
24 612
25 087
26 677
27 275
28  
29 897
30 154
31  
【答案解析】