【经验分享】数据结构——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)

在这里插入图片描述


🌈 嗨,我是命运之光!

🌌 2024,每日百字,记录时光,感谢有你,携手前行~

🚀 携手启航,我们一同深入未知的领域,挖掘潜能,让每一步成长都充满意义。


在做哈希查找冲突处理方法的题目时,关键是要清楚每种方法的步骤和原理。下面我将介绍如何构建解题过程中的表格,以及如何解答这些题目。

1. 线性探测(Linear Probing)

题目:给定一个哈希表大小 m = 7 m = 7 m=7的哈希表,插入一组关键字 [10, 22, 31, 4, 15, 28],并使用线性探测解决冲突。

步骤

  1. 计算每个关键字的哈希值 h ( k ) = k % m h(k) = k \% m h(k)=k%m
  2. 如果该位置为空,则插入;如果发生冲突,线性探测下一个位置直到找到空位。

表格

关键字 k k k初始哈希值 h ( k ) = k % 7 h(k) = k \% 7 h(k)=k%7插入位置
1033
2211
3134(冲突,线性探测到4)
445(冲突,线性探测到5)
1512(冲突,线性探测到2)
2800

表格内容

  • 列1: 关键字
  • 列2: 初始哈希值
  • 列3: 实际插入位置

2. 平方探测(Quadratic Probing)

题目:假设哈希表大小 (m = 7),插入关键字 [18, 41, 22, 44, 59],使用平方探测解决冲突。

步骤

  1. 计算初始哈希值。
  2. 如果发生冲突,使用平方探测 h i = ( h ( k ) + i 2 ) % m h_i = (h(k) + i^2) \% m hi=(h(k)+i2)%m寻找插入位置。

表格

关键字 k k k初始哈希值 h ( k ) = k % 7 h(k) = k \% 7 h(k)=k%7探测序列 h i = ( h ( k ) + i 2 ) % 7 h_i = (h(k) + i^2) \% 7 hi=(h(k)+i2)%7插入位置
1844, 54
41666
22111
4422, 32
5933, 4, 6, 00

表格内容

  • 列1: 关键字
  • 列2: 初始哈希值
  • 列3: 探测序列(尝试的插入位置)
  • 列4: 实际插入位置

3. 双散列探测(Double Hashing)

题目:在一个哈希表中,使用哈希函数 ( h 1 ( k ) = k % 7 (h_1(k) = k \% 7 (h1(k)=k%7 h 2 ( k ) = 1 + ( k % 5 ) h_2(k) = 1 + (k \% 5) h2(k)=1+(k%5) 对关键字 [19, 27, 36, 10] 进行插入,解决冲突时使用双散列。

步骤

  1. 计算初始哈希值 h 1 ( k ) h_1(k) h1(k)
  2. 如果发生冲突,计算第二个哈希值 h 2 ( k ) h_2(k) h2(k) 并进行双散列探测 h i = ( h 1 ( k ) + i × h 2 ( k ) ) % m h_i = (h_1(k) + i \times h_2(k)) \% m hi=(h1(k)+i×h2(k))%m

表格

关键字 k k k初始哈希值 h 1 ( k ) = k % 7 h_1(k) = k \% 7 h1(k)=k%7第二哈希值 h 2 ( k ) = 1 + ( k % 5 ) h_2(k) = 1 + (k \% 5) h2(k)=1+(k%5)插入位置
19555
27636
36121
10313

表格内容

  • 列1: 关键字
  • 列2: 初始哈希值
  • 列3: 第二哈希值(用于探测)
  • 列4: 实际插入位置

4. 分离链接法(Separate Chaining)

题目:哈希表大小为 m = 5 m = 5 m=5,插入关键字 [10, 21, 32, 43, 54],使用分离链接法解决冲突。

步骤

  1. 计算哈希值 h ( k ) = k % 5 h(k) = k \% 5 h(k)=k%5
  2. 将冲突的元素插入对应链表中。

表格

桶位置关键字链表
0[10]
1[21]
2[32]
3[43]
4[54]

表格内容

  • 列1: 桶位置
  • 列2: 链表中存储的关键字

5. 再散列(Rehashing)

题目:给定哈希表大小 m = 5 m = 5 m=5,插入关键字 [12, 26, 31, 17, 21, 8],当表的装填因子大于0.7时,进行再散列。

步骤

  1. 插入关键字并计算当前装填因子。
  2. 如果超过阈值,增加哈希表大小并重新计算所有元素的哈希值,重新插入。

表格

关键字 k k k初始哈希值 h ( k ) = k % 5 h(k) = k \% 5 h(k)=k%5插入位置装填因子
12220.2
26110.4
31130.6
17240.8(再散列)
2111(新的哈希表,重新计算位置)0.4
8330.5

表格内容

  • 列1: 关键字
  • 列2: 初始哈希值
  • 列3: 实际插入位置
  • 列4: 当前装填因子

如何解答这些常见问题

在处理涉及哈希查找冲突处理方法的题目时,以下是如何解答这些常见问题的步骤和方法:

1. 写出处理冲突的方法名称

常见的方法名称

  • 开放地址法:线性探测(Linear Probing)、平方探测(Quadratic Probing)、双散列探测(Double Hashing)、再散列(Rehashing)
  • 链地址法:分离链接法(Separate Chaining)

2. 构造基于该处理冲突方法的哈希表

示例:假设哈希表大小为 7,插入关键字 [10, 22, 31, 4, 15, 28]。

  • 线性探测:如前面所述,计算初始哈希值,然后逐步探测下一个空闲位置。
  • 平方探测:计算初始哈希值后,按平方探测公式寻找空闲位置。
  • 双散列探测:使用两个不同的哈希函数,根据冲突次数使用第二个哈希值探测位置。
  • 分离链接法:构造链表,存储发生冲突的元素。

表格

  • 线性探测和平方探测可以通过表格展示每个关键字的初始哈希值和最终插入位置。
  • 分离链接法通过展示每个桶位置的链表内容来表示。

3. 求出该哈希表在等概率情况下查找成功的ASL(平均查找长度)

计算方法

  • 成功查找的ASL 是所有查找成功的情况下的查找长度的平均值。
  • 每个元素在哈希表中的查找长度等于插入时探测到的位置数目。
  • 公式: ASL success = ∑ ( 每个元素的查找长度 ) 元素个数 \text{ASL}_{\text{success}} = \frac{\sum (\text{每个元素的查找长度})}{\text{元素个数}} ASLsuccess=元素个数(每个元素的查找长度)

示例
假设构造出的哈希表为:

位置关键字查找长度
0281
1152
2221
3101
4312
541
6--

那么成功查找的ASL为:
  ASL success = 1 + 2 + 1 + 1 + 2 + 1 6 = 1.33   \ \text{ASL}_{\text{success}} = \frac{1 + 2 + 1 + 1 + 2 + 1}{6} = 1.33 \  ASLsuccess=61+2+1+1+2+1=1.33 

4. 查找失败的ASL(平均查找长度)

计算方法

  • 失败查找的ASL 是查找一个元素不存在时所需探测长度的平均值。
  • 在开放地址法中,失败的查找长度是探测完所有空位后确认不存在该元素。
  • 公式:
    ASL failure = ∑ ( 失败时的查找长度 ) 失败查找次数   \text{ASL}_{\text{failure}} = \frac{\sum (\text{失败时的查找长度})}{\text{失败查找次数}} \ ASLfailure=失败查找次数(失败时的查找长度) 

示例
假设查找一个不存在的元素,它的查找长度为探测了 3 次才发现空位,另一种情况查找了 4 次才发现空位,那么失败查找的ASL为:
ASL failure = 3 + 4 2 = 3.5 \text{ASL}_{\text{failure}} = \frac{3 + 4}{2} = 3.5 \\ ASLfailure=23+4=3.5

5. 采用线性探测开放定址法处理冲突,构造哈希表

示例
假设哈希表大小为 7,插入关键字 [10, 22, 31, 4, 15, 28]。计算每个关键字的初始哈希值,并使用线性探测处理冲突。

表格

关键字 k k k初始哈希值 h ( k ) = k % 7 h(k) = k \% 7 h(k)=k%7插入位置
1033
2211
3134(冲突,线性探测到4)
445(冲突,线性探测到5)
1512(冲突,线性探测到2)
2800

6. 采用链地址法处理冲突,构造哈希表

示例
哈希表大小为 7,插入关键字 [10, 22, 31, 4, 15, 28],并使用链地址法解决冲突。

表格

位置链表内容
0[28]
1[22, 15]
2-
3[10]
4[31, 4]
5-
6-

总结

解题时,需要清晰理解每种冲突处理方法的原理,并熟练运用它们进行哈希表的构造和ASL的计算。合理构建表格可以帮助准确表达解题过程。


嗨,我是命运之光。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬
评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉 ,获取最新动态,⚡️ 让信息传递更加迅速。
在这里插入图片描述
在这里插入图片描述

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命运之光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值