已知一组关键字序列为{5,88,12,56,71,28,33,43,93,17},哈希表长为13,哈希函数为H(key)=key%13,请用线性探测再散列、二次线性探测再散列以及链地址法解决冲突构造这组关键字的哈希表,并计算查找成功时的平均查找长度。
时间: 2024-03-30 07:36:11 浏览: 213
哈希表实验C语言版实现
好的,我来回答你的问题。
对于给定的关键字序列{5,88,12,56,71,28,33,43,93,17},哈希表长为13,哈希函数为H(key)=key%13,我们可以采用以下三种方法解决冲突:
### 线性探测再散列
首先,我们将关键字序列依次插入哈希表中。对于发生冲突的情况,我们采用线性探测再散列的方法,即顺序查找哈希表中下一个空的位置来存储冲突的关键字。
插入后的哈希表如下所示:
| 下标 | 值 |
| ---- | ---- |
| 0 | |
| 1 | 88 |
| 2 | 12 |
| 3 | 56 |
| 4 | 71 |
| 5 | 28 |
| 6 | 33 |
| 7 | 43 |
| 8 | 93 |
| 9 | |
| 10 | 17 |
| 11 | |
| 12 | 5 |
其中,下标为9和11的位置没有存储任何关键字。
接下来,我们计算查找成功时的平均查找长度。假设我们要查找的关键字为28,它的哈希值为H(28)=28%13=2。首先,在下标为2的位置查找,发现存储的是12而不是28,于是继续往后查找,直到找到28为止。假设我们查找了k次,最终查找到了28,那么平均查找长度为:
ASL = (1/10) * (1 + 2 + … + k) = (k+1)/20
其中,10是关键字的个数,k是查找时查找过的位置数。
### 二次线性探测再散列
同样的,我们将关键字序列依次插入哈希表中。对于发生冲突的情况,我们采用二次线性探测再散列的方法,即按照以下公式来查找下一个空的位置:
H(key, i) = (H(key) + c1*i + c2*i^2) % 13
其中,c1和c2是正整数,i表示第几次探测。
插入后的哈希表如下所示:
| 下标 | 值 |
| ---- | ---- |
| 0 | |
| 1 | 88 |
| 2 | 12 |
| 3 | 56 |
| 4 | 71 |
| 5 | 28 |
| 6 | 33 |
| 7 | 43 |
| 8 | 93 |
| 9 | 17 |
| 10 | |
| 11 | |
| 12 | 5 |
其中,下标为10和11的位置没有存储任何关键字。
接下来,我们计算查找成功时的平均查找长度。假设我们要查找的关键字为28,它的哈希值为H(28)=28%13=2。首先,在下标为2的位置查找,发现存储的是12而不是28,于是按照二次线性探测再散列的公式计算下一个探测位置,即:
H(28, 1) = (2 + 1 + 1^2) % 13 = 4
然后,在下标为4的位置查找,发现存储的是71而不是28,于是计算下一个探测位置:
H(28, 2) = (2 + 1*2 + 2^2) % 13 = 9
然后,在下标为9的位置查找,发现存储的是17而不是28,最终在下标为5的位置查找到了28。假设我们查找了k次,最终查找到了28,那么平均查找长度为:
ASL = (1/10) * (1 + 2 + … + k) = (k+1)/20
其中,10是关键字的个数,k是查找时查找过的位置数。
### 链地址法
最后,我们采用链地址法来解决冲突。对于每个哈希值,我们都维护一个链表,将所有哈希值为该值的关键字都存储在该链表中。
插入后的哈希表如下所示:
| 下标 | 值 |
| ---- | --------- |
| 0 | |
| 1 | 88 |
| 2 | 12 |
| 3 | 56 |
| 4 | 71 |
| 5 | 28 -> 93 |
| 6 | 33 |
| 7 | 43 |
| 8 | |
| 9 | 17 |
| 10 | |
| 11 | |
| 12 | 5 |
其中,下标为0、8、10和11的位置没有存储任何关键字。
接下来,我们计算查找成功时的平均查找长度。假设我们要查找的关键字为28,它的哈希值为H(28)=28%13=2。首先,在下标为2的链表中查找,发现存储的是12而不是28,于是继续往后查找,直到找到28为止。假设我们查找了k次,最终查找到了28,那么平均查找长度为:
ASL = (1/10) * (1 + 2 + … + k) = (k+1)/20
其中,10是关键字的个数,k是查找时查找过的位置数。
综上所述,无论采用哪种方法,当查找成功时的平均查找长度都为(k+1)/20,其中k是查找时查找过的位置数。
阅读全文