14、哈希表碰撞解决策略及链式哈希表实现

哈希表碰撞解决策略及链式哈希表实现

1. 哈希表索引计算及线性探测

在进行一些简单的初始化后, htlIndexOf 方法会为传入的键计算哈希值(即索引值),并保存该值,以便检测是否完全绕哈希表一圈。获取引用槽的指针后,会根据槽的状态执行不同操作:
- 槽为空 :若到达该点,意味着未找到键,此时返回该槽的指针,函数结果为 -1 表示“未找到”。
- 槽正在使用 :将槽中存储的键与传入的键进行比较,若相同则找到正确项,返回槽指针并将函数结果设置为槽的索引。
- 继续查找 :若未通过上述比较退出方法,则查看下一个槽,同时确保检查回绕情况并再次循环。虽然检查是否访问了每个槽略显多余(哈希表是动态的,负载因子会保持在 1/6 到 2/3 之间),但这是良好的编程习惯。

以下是线性探测哈希表类 TtdHashTableLinear 的完整代码所在位置说明:其完整代码可在 TDHshLnP.pas 文件中找到。

2. 其他开放寻址方案

2.1 二次探测

二次探测算法试图避免线性探测中出现的槽聚集问题,它并非总是按顺序检查下一个槽,而是检查距离越来越远的槽。具体来说,若第一次探测失败,检查下一个槽;若第二次探测失败,检查隔四个槽的位置;若第三次探测失败,检查隔九个槽的位置,依此类推,后续探测跳跃 16、25、36 等个槽。但这种方法存在两个问题:
- 若许多键哈希到相同索引,它们的探测序列会相同,形成看似分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值