已知散列表的地址区问为0~10,散列函数为 H(K=k% 11,采用线性探测法处理冲突。 ,设计算法在其 中查找值为x的元素,若查找成功,返回其下标,否则返回一1。
时间: 2023-08-06 11:08:23 浏览: 171
算法如下:
1. 根据散列函数 H(K) = k % 11 计算出要查找元素 x 的散列地址 h。
2. 如果散列表中第 h 个位置存放的元素就是 x,则返回 h。
3. 如果第 h 个位置为空,则说明散列表中没有 x 这个元素,返回 -1。
4. 如果第 h 个位置存放的元素不是 x,则向后依次查找下一个位置,直到找到一个空位置或者找到了 x。
5. 如果找到了 x,则返回其下标;如果找到了空位置,则说明散列表中没有 x 这个元素,返回 -1。
算法实现的代码如下:
```
int linear_probe_search(int* hash_table, int x) {
int h = x % 11; // 计算散列地址
while (hash_table[h] != -1) {
if (hash_table[h] == x) // 找到了 x
return h;
h = (h + 1) % 11; // 继续查找下一个位置
}
return -1; // 散列表中没有 x 这个元素
}
```
其中,散列表的初始值全部设为 -1,表示该位置为空。
相关问题
已知散列表的地址区间为0~10,散列函数为H(k)=k % 11,采用线性探测法处理冲突。设计算法在其中查找值为x的元素,若查找成功,返回其下标,否则返回-1
好的,针对你的问题,我来为你解答。
根据线性探测法,如果散列表中第H(x)个位置已经被占用,那么我们需要依次往后查找,直到找到一个空闲的位置或者查找到了值为x的元素,具体实现如下:
```python
def linear_probing_search(hash_table, x):
i = x % 11 # 计算散列地址
while hash_table[i] is not None: # 如果该地址已经被占用
if hash_table[i] == x: # 如果找到了值为x的元素
return i
i = (i + 1) % 11 # 继续往后查找
if i == x % 11: # 如果已经查找了一遍
break # 退出循环
return -1 # 没有找到,返回-1
```
在这个算法中,我们通过取模运算计算出了x的散列地址,并将其作为线性探测的起点。如果该地址已经被占用,我们就依次往后查找,直到找到一个空闲的位置或者查找到了值为x的元素。如果已经查找了一遍,却没有找到值为x的元素,就说明散列表中不存在x,返回-1即可。
希望这个算法能够帮助你解决问题,有什么不懂的地方,可以继续向我提问哦。
已知一散列表的地址区间为 0~10,散列函数为 h(x) = x % 11,采用线性探测法处理冲 突。试将关键字序列[20,30,70,15,8,12,18,63,19]依次存储到散列表中,假定 每个关键字的查找概率相等,求查找成功时的平均查找长度
首先,将散列表初始化为空,然后依次将关键字序列插入散列表中。插入时,如果发生冲突,则采用线性探测法,即从当前位置开始,顺次向后查找第一个空闲位置进行插入。
插入过程如下:
1. 插入关键字 20,计算 h(20) = 9,散列表位置 9 为空,将关键字 20 存储到位置 9,此时散列表为:[ , , , , , , , , , 20]。
2. 插入关键字 30,计算 h(30) = 8,散列表位置 8 为空,将关键字 30 存储到位置 8,此时散列表为:[ , , , , , , , , 30, 20]。
3. 插入关键字 70,计算 h(70) = 4,散列表位置 4 为空,将关键字 70 存储到位置 4,此时散列表为:[ , , , , 70, , , , 30, 20]。
4. 插入关键字 15,计算 h(15) = 4,散列表位置 4 已被占用,从位置 5 开始顺次向后查找空闲位置,发现位置 5 为空,将关键字 15 存储到位置 5,此时散列表为:[ , , , , 70, 15, , , 30, 20]。
5. 插入关键字 8,计算 h(8) = 8,散列表位置 8 已被占用,从位置 9 开始顺次向后查找空闲位置,发现位置 0 为空,将关键字 8 存储到位置 0,此时散列表为:[8, , , , 70, 15, , , 30, 20]。
6. 插入关键字 12,计算 h(12) = 1,散列表位置 1 为空,将关键字 12 存储到位置 1,此时散列表为:[8, 12, , , 70, 15, , , 30, 20]。
7. 插入关键字 18,计算 h(18) = 7,散列表位置 7 为空,将关键字 18 存储到位置 7,此时散列表为:[8, 12, , , 70, 15, , 18, 30, 20]。
8. 插入关键字 63,计算 h(63) = 8,散列表位置 8 已被占用,从位置 9 开始顺次向后查找空闲位置,发现位置 10 为空,将关键字 63 存储到位置 10,此时散列表为:[8, 12, , , 70, 15, , 18, 30, 20, 63]。
查找过程如下:
假设要查找关键字 x,计算 h(x) 得到散列表位置 i,从位置 i 开始顺次向后查找,直到找到 x 或者遇到一个空闲位置为止。
假设要查找关键字 15,计算 h(15) = 4,从位置 4 开始向后查找,位置 4 存储的是关键字 70,位置 5 存储的是关键字 15,查找成功,查找长度为 2。
假设要查找关键字 13,计算 h(13) = 2,从位置 2 开始向后查找,发现位置 2 为空,查找失败,查找长度为 1。
假设要查找关键字 63,计算 h(63) = 8,从位置 8 开始向后查找,位置 8 存储的是关键字 30,位置 9 存储的是关键字 20,位置 10 存储的是关键字 63,查找成功,查找长度为 3。
假设要查找关键字 25,计算 h(25) = 3,从位置 3 开始向后查找,发现位置 3 为空,查找失败,查找长度为 1。
根据题意,每个关键字的查找概率相等,因此查找成功时的平均查找长度为:
(2 + 1 + 3) / 3 = 2
阅读全文