“Cuckoo Hashing 是哈希表中的开放定址方案:每个键只允许落在少数候选位置,查询因此只检查常数个槽位,插入则通过重定位链恢复这一位置约束。”
形式陈述 ​
哈希表用哈希函数
直觉
哈希表把大键空间映射为一个可快速计算的“近似地址”,直接跳到键可能所在的有限桶数组,再在碰撞结构中做少量局部工作。期望效率来自“键分布经哈希后近似均匀”,而非数组访问本身神奇地消除搜索。碰撞不可避免,必须由链式、开放寻址等策略解析;负载因子控制每桶竞争和探测长度。哈希值相同只表示候选桶相同,最终仍需比较键以确认相等。
例子与边界
链地址把同槽键放入链表或小容器;开放寻址把所有键留在数组并按探测序列寻找空槽。删除开放寻址元素常需墓碑,否则会截断后续查找路径。扩容并重新哈希可保持负载因子,但单次扩容为线性成本,通常靠摊还分析得到长期常数。密码学哈希强调抗碰撞/抗攻击,普通算法哈希只需分布和速度,目标不同。
容量
最坏情况下所有键碰撞,操作退化为
推论与应用
数组提供桶,哈希函数提供定位,二者共同实现字典、映射与集合 ADT。面对预先固定的最坏键集,通用哈希把随机性放在选函数上;静态集合可进一步用完美哈希把碰撞消除。若只需节省空间的近似成员查询,Bloom Filter允许假阳性,但它不存储值,也不是哈希表的冲突处理方式。
这些结构的保证属于不同概率空间与更新模型。哈希表页只承担冲突解决、负载因子和期望复杂度框架;密码哈希的计算抗碰撞、完美哈希的静态构建以及 Bloom Filter 的误报率分别由专页定义,不能以“平均
哈希表主体只承诺字典语义与负载参数,冲突策略应分层阅读:通用哈希给对固定键集的碰撞期望,Perfect Hashing针对静态集合换最坏常数查询,开放定址把键直接放入数组并依探测链,Cuckoo Hashing用两个候选位置和重哈希。Bloom Filter允许假阳性,已不再实现精确字典;不能把其节省空间与哈希表查询并列成同一保证。
参考资料
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Ch. 11, hash tables, chaining, and open addressing。
- Robert Sedgewick and Kevin Wayne, Algorithms, 4th ed., Addison-Wesley, 2011,§3.4, hash tables and symbol-table implementations。