设有一组关键字 { 29,01, 13,15,56,20,87,27,69,9,10,74 },散列函数为 H(key)=key%17,采用线性探测方法解决冲突。试在 0 到 18 的散列地址空间中对该关键字序列构造散列表,则成功查找的平均查找长度为 __
时间: 2024-04-30 13:18:52 浏览: 68
在使用线性探测法解决冲突时,如果一个关键字的散列地址已经被占用,就顺序往后探测,直到找到一个空闲位置为止。因此,需要构造一个散列表,使得每个关键字都能找到一个空闲位置,或者在探测的过程中找到自己的位置。可以使用如下步骤:
1. 初始化一个长度为 17 的散列表,每个位置都为空。
2. 对于每个关键字,计算其散列地址 H(key),并检查对应位置是否为空。如果为空,就将该关键字存储在该位置;否则,就顺序往后探测,直到找到一个空闲位置为止。如果探测到散列表的末尾仍然没有找到空闲位置,则从头开始继续探测,直到找到一个空闲位置。
下面是具体的构造过程:
关键字 | 散列地址 | 备注
-------|---------|-----
29 | 12 |
01 | 1 |
13 | 13 |
15 | 15 |
56 | 4 |
20 | 3 |
87 | 6 |
27 | 10 |
69 | 4 | 冲突,探测到 5
9 | 9 |
10 | 10 | 冲突,探测到 11
74 | 8 | 冲突,探测到 0
构造完成后,散列表如下:
```
0: 74
1: 01
2:
3: 20
4: 56
5:
6: 87
7:
8: 69
9: 9
10: 27
11: 10
12: 29
13: 13
14:
15: 15
16:
```
平均查找长度是指查找成功和查找失败情况下查找长度的加权平均值。对于本题,可以分别计算查找成功和查找失败的平均查找长度,并加权求和得到总的平均查找长度。
查找成功的平均查找长度:
关键字 | 散列地址 | 查找长度
-------|---------|-------
01 | 1 | 1
13 | 13 | 1
15 | 15 | 1
20 | 3 | 1
27 | 10 | 1
29 | 12 | 1
69 | 4 | 2
74 | 8 | 1
87 | 6 | 1
9 | 9 | 1
总计 | | 10
查找失败的平均查找长度:
散列表中没有的关键字有 7 个,它们的散列地址分别是:
```
2, 7, 11, 14, 16, 0, 5
```
在线性探测中,如果要查找的关键字不在散列表中,就需要顺序往后探测,直到找到一个空闲位置为止。因此,查找失败的平均查找长度可以近似地计算为:
$$
\frac{\sum_{i=1}^{7}(\text{探测长度}-1)}{17}
$$
其中,探测长度为在散列表中探测到空闲位置时经过的位置数。例如,对于关键字 2,探测长度为 1。对于关键字 7,探测长度为 11-7=4。
因此,查找失败的平均查找长度为:
$$
\frac{(1-1)+(0-1)+(1-1)+(0-1)+(1-1)+(18-1)+(1-1)}{17} \approx 0.53
$$
总的平均查找长度为:
$$
\frac{10+0.53}{12} \approx 0.88
$$
因此,成功查找的平均查找长度为 0.88。
阅读全文