“Cuckoo Hashing 是哈希表中的开放定址方案:每个键只允许落在少数候选位置,查询因此只检查常数个槽位,插入则通过重定位链恢复这一位置约束。”
形式陈述 ​
探测接口 ​
开放定址把哈希表的全部键直接存入容量为
并要求固定键的探测序列覆盖所有槽。查找依次检查
随机探测假设与期望界 ​
令活键负载为
成功查找至多约
直觉
开放定址把冲突处理变成数组内的一段搜索轨迹:当前位置已占用,就沿该键自己的探测序列继续。连续数组常带来良好的缓存局部性,却也让停止条件成为正确性的一部分——从未使用的空槽证明键不在后续位置,曾经使用后又删除的槽则不能提供同样证明。
随机探测排列模型把每次访问看成从尚未检查的槽中均匀取下一个位置,所以剩余空槽比例
例子与边界
删除链例子 ​
若键
三类探测的不同前提 ​
线性探测
Uniform hashing 分析把探测序列视为随机排列,强于“首页位置均匀”。现实方法可能有更专门的 cluster 分析;不能把
两种占用率与重建时机 ​
含墓碑的实现要区分活键负载
因此重建条件通常同时监控“活键过多”和“墓碑过多”。原地把新键写进首个墓碑前,仍要继续探测到真空槽或已有同键,否则可能为同一键建立两个副本。
一次扩容应新建更大表并重新插入所有有效键,墓碑不能原样复制。若扩容阈值固定低于 1,每次重建后的容量至少成比例增长,累计搬迁为线性,从而保持插入摊还常数;这仍不提供单次操作最坏延迟。
推论与应用
墓碑率或负载越过阈值后应全局重建。扩张与收缩阈值需要迟滞,避免插删交替时反复搬迁;重建必须生成新的探测状态,不能把墓碑原样复制。开放定址与 chaining 都实现哈希字典,却在删除、最大装载率、内存局部性和并发发布顺序上使用不同不变量。
Universal hashing控制不同键在所选哈希函数下碰撞的概率,可作为哈希族比较入口,但它不等价于 simple uniform hashing,也不能单独为经典随机探测排列界背书。线性探测和 tabulation hashing 等具体组合有各自的聚簇分析;若随机种子暴露给自适应对手,还需明确更强的独立性、安全重播或重建假设。
参考资料
- Donald Knuth, The Art of Computer Programming, Vol. 3, 2nd ed., Addison-Wesley, 1998, Hashing.
- Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, Open Addressing.
- Mihai Pătraşcu, Mikkel Thorup, The Power of Simple Tabulation Hashing, JACM, 2012.