在哈希函数的冲突解决中,线性检测和二次检测是两种开放地址法的解决策略,它们的区别主要体现在冲突发生时生成探测地址的方式上:
1. 线性检测 (Linear Probing)
线性检测通过固定步长(通常为1)依次探测下一个槽位,直到找到空槽为止。
探测公式:
[
h(k, i) = (h(k) + i) \mod m
]
其中:
- ( h(k) ) 是哈希函数。
- ( i ) 是第 ( i ) 次探测。
- ( m ) 是哈希表的大小。
特点:
- 简单易实现。
- 容易出现主聚集(Primary Clustering)问题:冲突的元素倾向于聚集在一起,导致探测效率降低。
2. 二次检测 (Quadratic Probing)
二次检测通过平方增量的方式探测槽位,从而避免探测地址的线性增长模式。
探测公式:
[
h(k, i) = (h(k) + c_1 \cdot i + c_2 \cdot i^2) \mod m
]
其中:
- ( c_1 ) 和 ( c_2 ) 是常数,通常 ( c_1 = c_2 = 1 )。
- ( i ) 是第 ( i ) 次探测。
特点:
- 减少了主聚集问题,因为探测地址分布更分散。
- 可能出现次聚集(Secondary Clustering):哈希值相同的元素仍可能形成聚集。
区别总结
| 属性 | 线性检测 | 二次检测 |
|---|---|---|
| 探测地址变化模式 | 等差序列(线性增长) | 等差平方序列(非线性增长) |
| 聚集问题 | 容易出现主聚集 | 减少主聚集,但可能有次聚集 |
| 实现复杂度 | 简单 | 略复杂 |
| 探测范围 | 全表(在 ( m ) 为素数时) | 可能不能覆盖全表(需要控制参数) |
两种方法在实际应用中各有优劣,选择时需要权衡性能和实现的复杂性。
684

被折叠的 条评论
为什么被折叠?



