( 已知一组关键字序列为{5,88,12,56,71,28,33,43,93,17},哈希表长为 13,哈希函数为H(key)=key%13,请用线性探测再散列、二次线性探测再散列以及链地址法解决冲突构造这组关键字的哈希表,并计算查找成功时的平均查找长度。
时间: 2023-07-27 18:16:16 浏览: 256
好的,我会根据你的要求进行计算和构造哈希表。首先,我们可以根据哈希函数H(key)=key%13来确定每个关键字所在的桶号。下面依次介绍三种解决冲突的方法。
1. 线性探测再散列
线性探测再散列是一种常用的解决哈希冲突的方法,具体实现方式是:当插入一个关键字时,如果发现该位置已被占用,则向后依次查找下一个位置,直到找到一个空闲位置为止。这里我们使用线性探测再散列来构造哈希表。
首先,我们可以将每个关键字根据哈希函数H(key)=key%13计算出它所在的桶号,然后将关键字插入到对应的桶中。如果发现该桶已被占用,则向后依次查找下一个位置,直到找到一个空闲位置为止。
经过这样的操作,得到的哈希表如下所示:
```
桶号 关键字
0 88
1 43
2 93
3 12
4 56
5 71
6 28
7 33
8 5
9 17
10 -
11 -
12 -
```
其中,"-"表示该位置为空。
为了计算查找成功时的平均查找长度,我们需要先确定各个关键字的查找长度,然后求它们的平均值。对于成功查找的关键字,它的查找长度就是它在哈希表中的位置。因此,可以得到各个关键字的查找长度如下:
```
88: 1
43: 1
93: 1
12: 1
56: 1
71: 1
28: 1
33: 1
5: 1
17: 1
```
因此,这组关键字的平均查找长度为1。
2. 二次线性探测再散列
二次线性探测再散列是一种改进的线性探测再散列方法,具体实现方式是:当插入一个关键字时,如果发现该位置已被占用,则向后依次查找下一个位置,直到找到一个空闲位置为止。这里我们使用二次线性探测再散列来构造哈希表。
首先,我们可以将每个关键字根据哈希函数H(key)=key%13计算出它所在的桶号,然后将关键字插入到对应的桶中。如果发现该桶已被占用,则使用二次探测再散列的方法来查找下一个位置。具体来说,如果第i次查找时,发现桶H(key)+i^2已被占用,则继续向后查找,直到找到一个空闲位置为止。
经过这样的操作,得到的哈希表如下所示:
```
桶号 关键字
0 88
1 43
2 93
3 12
4 56
5 71
6 28
7 33
8 5
9 17
10 -
11 -
12 -
```
其中,"-"表示该位置为空。
为了计算查找成功时的平均查找长度,我们需要先确定各个关键字的查找长度,然后求它们的平均值。对于成功查找的关键字,它的查找长度就是它在哈希表中的位置。因此,可以得到各个关键字的查找长度如下:
```
88: 1
43: 1
93: 1
12: 1
56: 1
71: 1
28: 1
33: 1
5: 1
17: 1
```
因此,这组关键字的平均查找长度为1。
3. 链地址法
链地址法是一种常用的解决哈希冲突的方法,具体实现方式是:当插入一个关键字时,将它插入到对应桶的链表中。如果出现多个关键字映射到同一个桶中,就将它们插入到同一个链表中。
首先,我们可以将每个关键字根据哈希函数H(key)=key%13计算出它所在的桶号,然后将关键字插入到对应的桶中。如果发现该桶已经有关键字了,则将新的关键字插入到该桶对应的链表中。
经过这样的操作,得到的哈希表如下所示:
```
桶号 关键字
0 88
1 43 -> 71
2 93
3 12 -> 33
4 56
5 -
6 28
7 -
8 5
9 17
10 -
11 -
12 -
```
其中,"->"表示链表指针。
为了计算查找成功时的平均查找长度,我们需要先确定各个关键字的查找长度,然后求它们的平均值。对于成功查找的关键字,它的查找长度就是它在链表中的位置。因此,可以得到各个关键字的查找长度如下:
```
88: 1
43: 1
93: 1
12: 1
56: 1
71: 2
28: 1
33: 2
5: 1
17: 1
```
因此,这组关键字的平均查找长度为1.2。
综上所述,根据这组关键字构造的哈希表中,三种解决冲突的方法中,平均查找长度最短的是线性探测再散列和二次线性探测再散列,它们的平均查找长度均为1,而链地址法的平均查找长度稍长,为1.2。
阅读全文