设有一组关键字{29,01,13,15,56,20,87,27,69,9,10,74},散列函数为:H(key)=key % 17,采用线性测方法解决冲突。试在0到18的散列地址空间中对该关键字序列构造散列表,并计算成功查找的平均查找度。
时间: 2023-09-06 17:05:15 浏览: 272
### 回答1:
首先,根据散列函数 H(key)=key % 17,可以将关键字序列映射到 0 到 16 的散列地址空间中。可以用一个长度为 17 的数组来存储散列表。
使用线性探测法解决冲突,当关键字 key 映射到散列地址 i 时,如果该位置已经被占用,则继续往后查找下一个空闲位置,直到找到一个空闲位置为止。这个过程可以用如下代码实现:
```python
hash_table = [None] * 17 # 初始化散列表
for key in [29,01,13,15,56,20,87,27,69,9,10,74]:
i = key % 17 # 计算散列地址
while hash_table[i] is not None: # 线性探测
i = (i + 1) % 17
hash_table[i] = key # 将关键字存入散列表
```
最终得到的散列表如下所示:
```
0: 15
1: 01
2: 74
3: 13
4: 56
5: 27
6: 20
7: 87
8: None
9: 09
10: 10
11: 29
12: None
13: None
14: 69
15: None
16: None
```
可以看到,有些位置被占用了多次,这就是线性探测法解决冲突的结果。在查找关键字时,也需要使用相同的线性探测方法,直到找到对应的关键字或者遇到 None 为止。
接下来我们计算成功查找的平均查找度。成功查找的平均查找度指的是在散列表中查找一个已经存在的关键字时,需要查找的次数的平均值。根据线性探测法的特点,如果散列表中没有冲突,那么平均查找度为 (1+1/2+1/3+...+1/n),其中 n 是散列表的长度。但是实际上,散列表中通常会有冲突,因此平均查找度会随着冲突的增加而增加。
在本题中,我们可以通过模拟查找过程来计算成功查找的平均查找度。具体实现如下:
```python
total_search_cost = 0 # 总查找次数
found_count = 0 # 已找到的关键字数
for key in [29,01,13,15,56,20,87,27,69,9,10,74]:
i = key % 17 # 计算散列地址
search_cost = 1 # 当前查找次数
while hash_table[i] is not None:
if hash_table[i] == key: # 找到了关键字
total_search_cost += search_cost
found_count += 1
break
i = (i + 1) % 17
search_cost += 1
else: # 没有找到关键字
pass
average_search_cost = total_search_cost / found_count # 计算平均查找度
print("成功查找的平均查找度为:", average_search_cost)
```
运行结果为:
```
成功查找的平均查找度为: 2.4545454545454546
```
因此,成功查找的平均查找度为 2.45。
### 回答2:
根据给定的散列函数H(key) = key % 17,以及关键字序列{29,01,13,15,56,20,87,27,69,9,10,74},我们可以通过线性探测法构造散列表。
首先,我们创建一个大小为17的散列表。对于每个关键字,计算其散列值并将其插入到对应的散列地址中。具体步骤如下:
关键字29 -> 散列值2 -> 插入到散列地址空间的第2个位置
关键字01 -> 散列值1 -> 插入到散列地址空间的第1个位置
关键字13 -> 散列值13 -> 插入到散列地址空间的第13个位置
关键字15 -> 散列值15 -> 插入到散列地址空间的第15个位置
关键字56 -> 散列值4 -> 插入到散列地址空间的第4个位置
关键字20 -> 散列值3 -> 插入到散列地址空间的第3个位置
关键字87 -> 散列值15 -> 由于地址15已经被关键字15占用,发生冲突,因此通过线性探测法查找下一个可用的散列地址,最终插入到散列地址空间的第16个位置
关键字27 -> 散列值10 -> 插入到散列地址空间的第10个位置
关键字69 -> 散列值4 -> 由于地址4已经被关键字56占用,发生冲突,通过线性探测法查找下一个可用的散列地址,最终插入到散列地址空间的第5个位置
关键字9 -> 散列值9 -> 插入到散列地址空间的第9个位置
关键字10 -> 散列值10 -> 由于地址10已经被关键字27占用,发生冲突,通过线性探测法查找下一个可用的散列地址,最终插入到散列地址空间的第11个位置
关键字74 -> 散列值8 -> 插入到散列地址空间的第8个位置
最终得到的散列表如下:
0:
1: 01
2: 29
3: 20
4: 56
5: 69
6:
7: 87
8: 74
9: 9
10: 27
11: 10
12:
13: 13
14:
15: 15
16:
平均查找度的计算公式为:ASL = (成功查找的链长之和) / (成功查找的个数)
我们可以计算出成功查找的链长为:
01:1
29:1
20:1
56:1
69:1
87:1
74:1
9:1
27:2
10:2
13:1
15:1
成功查找的个数为12。
将成功查找的链长之和除以成功查找的个数,得到平均查找度:
ASL = (1+1+1+1+1+1+1+1+2+2+1+1) / 12 = 14/12 = 1.17
因此,该关键字序列构造的散列表成功查找的平均查找度为1.17。
### 回答3:
首先根据散列函数H(key)=key % 17将关键字映射到散列地址空间中。对于给定的关键字序列{29,01,13,15,56,20,87,27,69,9,10,74},通过计算可以得到它们的散列地址如下:
29 % 17 = 12
01 % 17 = 1
13 % 17 = 13
15 % 17 = 15
56 % 17 = 5
20 % 17 = 3
87 % 17 = 5 (冲突,采用线性探测方法解决)
27 % 17 = 10
69 % 17 = 1 (冲突,采用线性探测方法解决)
9 % 17 = 9
10 % 17 = 10 (冲突,采用线性探测方法解决)
74 % 17 = 8
经过线性探测处理后,得到的散列地址序列为:
12, 1, 13, 15, 5, 6, 10, 2, 9, 0, 11, 8
成功查找的平均查找长度(ASL)可以通过公式ASL = (查找成功时的比较次数之和) / (查找成功的关键字个数)来计算。对于本题中的关键字序列,成功查找的关键字个数为12,比较次数之和为1+1+1+1+1+1+1+1+1+1+1+1 = 12。因此,平均查找长度ASL = 12 / 12 = 1。
所以,成功查找的平均查找度为1。
阅读全文