结构推理
按α=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 | |
【答案解析】