“与 FKS 完美哈希相比,MPHF 把 $n$ 个已知键压成连续编号,适合把外部值数组直接按编号排列。FKS 的二级表总空间虽为 $O(n)$,却通常含空槽,因此不一定 minimal。”
形式陈述 ​
对有限静态键集
FKS 两层方案令
桶
直觉 ​
静态集合已经知道全部键,因而可以反复试验哈希函数,直到这些键恰好不冲突。FKS 不强求一级无碰撞,而是给拥挤桶二次空间:桶大小平方后的槽数让随机无碰撞有常数成功概率,一级再保证所有平方空间之和仍为线性。
普通哈希表把碰撞留给查询时处理;完美哈希把代价前移到构建阶段,换取每次查询固定次数的定位。这一交换依赖键集不再变化。
例子与边界 ​
若一级桶大小依次为
perfect 不等于 minimal perfect:FKS 总空间线性,却通常拥有空槽;minimal perfect 还要求值域正好有
插入一个新键可能与现有二级函数冲突,删除则留下空位;频繁动态更新会触发局部或整体重建。若工作负载不是静态字典,应使用动态哈希方案,不能沿用 FKS 的最坏常数查询与期望线性一次构建而忽略维护成本。
推论与应用 ​
完美哈希适合编译器保留字、静态路由表和生成后只读的键集合。它还能把静态成员查询变成固定的两次定位,并通过键核对安全处理不属于
minimal perfect hashing 进一步压缩槽域,常用于大型静态词典;它解决的是空间编号问题,不自动保存值、排序或范围查询。是否需要最小性,应由存储预算决定,而不是把它当作完美哈希的必备条件。
参考资料
- Michael L. Fredman, János Komlós, and Endre Szemerédi, “Storing a Sparse Table with O(1) Worst Case Access Time,” Journal of the ACM 31(3), 1984, pp. 538–544.
- Thomas H. Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, §11.5, static hashing.