已知散列函数H(key)=key %13,处理冲突的方法为二次探测再散列法,散列表的表长为15,对关键字序列{32、24、15、20、37、45、67}进行散列表的构建。 (1)请写出构建散列表的详细计算过程。 (2)请计算在等概率的情况下查找成功时的平均查找长度ASL。
时间: 2024-02-26 17:56:15 浏览: 106
处理散列冲突的方法
好的,我会根据你的要求回答问题。针对你的问题:
1. 构建散列表的详细计算过程如下:
首先,我们需要将关键字序列插入到散列表中。按照散列函数H(key)=key%13,可以得到每个关键字的散列地址:
- 32 % 13 = 6
- 24 % 13 = 11
- 15 % 13 = 2
- 20 % 13 = 7
- 37 % 13 = 11
- 45 % 13 = 6
- 67 % 13 = 9
发现第2个和第5个关键字的散列地址相同,因此需要采用二次探测再散列法来解决冲突。具体地,我们从第一个关键字的散列地址开始,依次探测下一个位置,如果遇到冲突,则按照二次探测公式计算下一个探测位置:
$$
H_i = (H(key) + i^2) \% 15
$$
其中,$H(key)$ 是散列函数计算得到的关键字的散列地址,$i$ 表示二次探测的次数,$H_i$ 表示第 $i$ 次探测得到的散列地址。
具体地,我们依次插入关键字,并根据二次探测再散列法解决冲突:
- 插入关键字32,散列地址为6,散列表中的第6个位置为空,直接插入。
- 插入关键字24,散列地址为11,散列表中的第11个位置为空,直接插入。
- 插入关键字15,散列地址为2,散列表中的第2个位置为空,直接插入。
- 插入关键字20,散列地址为7,散列表中的第7个位置为空,直接插入。
- 插入关键字37,散列地址为11,散列表中的第11个位置已经被占用,需要进行二次探测,计算下一个探测位置:
$$
H_1 = (11 + 1^2) \% 15 = 12
$$
散列表中的第12个位置也被占用了,需要继续探测:
$$
H_2 = (11 + 2^2) \% 15 = 2
$$
散列表中的第2个位置已经被占用,需要继续探测:
$$
H_3 = (11 + 3^2) \% 15 = 0
$$
散列表中的第0个位置为空,将关键字37插入到该位置。
- 插入关键字45,散列地址为6,散列表中的第6个位置已经被占用,需要进行二次探测,计算下一个探测位置:
$$
H_1 = (6 + 1^2) \% 15 = 7
$$
散列表中的第7个位置已经被占用了,需要继续探测:
$$
H_2 = (6 + 2^2) \% 15 = 10
$$
散列表中的第10个位置为空,将关键字45插入到该位置。
- 插入关键字67,散列地址为9,散列表中的第9个位置为空,直接插入。
最终得到的散列表如下:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|
| 37| | 15| | | | 32| 20| | 67 | 45| 24| | | |
2. 在等概率的情况下查找成功时的平均查找长度ASL可以通过以下公式计算:
$$
ASL = \sum_{i=1}^{n} P_i \cdot S_i
$$
其中,$n$ 是散列表中关键字的个数,$P_i$ 表示查找的关键字等于第 $i$ 个关键字的概率,$S_i$ 表示查找第 $i$ 个关键字时需要探测的次数。
在本题中,$n=7$,每个关键字的概率相等,即$P_i=\frac{1}{n}=\frac{1}{7}$。根据散列函数和二次探测公式,可以得到每个关键字需要探测的次数如下:
- 32: 1
- 24: 1
- 15: 0
- 20: 1
- 37: 3
- 45: 2
- 67: 0
因此,可以计算得到平均查找长度为:
$$
ASL = \frac{1}{7}(1+1+0+1+3+2+0) = \frac{8}{7} \approx 1.143
$$
所以,查找成功时的平均查找长度ASL约为1.143。
阅读全文