给定输入{4317, 1323, 6173, 4199, 4344, 9679, 1989},散列表的长度为11,散列函数为H(x)=X mod 11,写出下列结果。 (1) 线性探测散列表。 (2) 二次探测散列表。 (3) 开散列表。
时间: 2023-07-14 16:13:40 浏览: 80
(1) 线性探测散列表:
首先,将输入数据按照散列函数H(x)=X mod 11计算散列地址,得到如下表格:
| 数据 | 散列地址 |
|------|---------|
| 4317 | 9 |
| 1323 | 8 |
| 6173 | 4 |
| 4199 | 7 |
| 4344 | 10 |
| 9679 | 5 |
| 1989 | 8 |
由于散列地址冲突了,所以需要进行线性探测。当插入数据时,从冲突的散列地址开始向后查找,直到找到一个空闲的散列地址为止。如果查找到散列表的末尾了,就从头开始查找,直到找到一个空闲的散列地址为止。具体过程如下表所示:
| 数据 | 散列地址 | 冲突次数 | 实际地址 |
|------|---------|---------|---------|
| 4317 | 9 | 0 | 9 |
| 1323 | 8 | 0 | 8 |
| 6173 | 4 | 0 | 4 |
| 4199 | 7 | 0 | 7 |
| 4344 | 10 | 0 | 10 |
| 9679 | 5 | 0 | 5 |
| 1989 | 8 | 1 | 9 |
最终的散列表如下:
| 实际地址 | 数据 |
|---------|------|
| 0 | |
| 1 | |
| 2 | |
| 3 | |
| 4 | 6173 |
| 5 | 9679 |
| 6 | |
| 7 | 4199 |
| 8 | 1323 |
| 9 | 4317 |
| 10 | 4344 |
(2) 二次探测散列表:
二次探测散列表的查找方式和线性探测类似,只不过探测的步长变成了二次函数。具体过程如下表所示:
| 数据 | 散列地址 | 冲突次数 | 实际地址 |
|------|---------|---------|---------|
| 4317 | 9 | 0 | 9 |
| 1323 | 8 | 0 | 8 |
| 6173 | 4 | 0 | 4 |
| 4199 | 7 | 0 | 7 |
| 4344 | 10 | 0 | 10 |
| 9679 | 5 | 0 | 5 |
| 1989 | 8 | 1 | 0 |
由于在探测过程中发现实际地址为8的位置已经被占用了,所以在探测到实际地址为8的位置时,需要继续往后探测。最终的散列表如下:
| 实际地址 | 数据 |
|---------|------|
| 0 | 1989 |
| 1 | |
| 2 | |
| 3 | |
| 4 | 6173 |
| 5 | 9679 |
| 6 | |
| 7 | 4199 |
| 8 | 1323 |
| 9 | 4317 |
| 10 | 4344 |
(3) 开散列表:
开散列表采用链表的方式解决散列冲突。具体过程如下表所示:
| 数据 | 散列地址 | 链表 |
|------|---------|------|
| 4317 | 9 | |
| 1323 | 8 | 1989 |
| 6173 | 4 | |
| 4199 | 7 | |
| 4344 | 10 | |
| 9679 | 5 | |
| 1989 | 8 | |
最终的散列表如下:
| 散列地址 | 链表 |
|---------|-------------|
| 0 | |
| 1 | |
| 2 | |
| 3 | |
| 4 | 6173 |
| 5 | 9679 |
| 6 | |
| 7 | 4199 |
| 8 | 1323 -> 1989 |
| 9 | 4317 |
| 10 | 4344 |
阅读全文