Fredman构造法构造完备哈希
在刘璟的《计算机算法引论——设计与分析》一书中介绍了几种完备哈希(PHF)构造技术,里面提到了Fredman构造法。这本书是零几年写的比较早,光看书中介绍不太容易理解这一构造法的具体流程,搜了一下网上居然极少有这一方法的介绍,看了很多数据结构与算法的书也很少有。在这里先介绍原理与构造方法,再拿一个例子过一遍操作。
原理:
Fredman通过构造法证明了:对任意的关键字集合S⊆U,|S|=n,至多取m=3n(即m≤3n,α=n/m>0.33),一定可以在形如
h(x)=((kx) mod N) mod n (N=|U|)
的Hash函数中找到S的PHF。相关的论文应该是这一篇Storing asparse table with O(1) worst case access time
构造方法:
已知:实际关键词集合S⊆U,|S|=n,且|U|=N为素数。
1. 对此S,先构造函数
h'(x)=((kx) mod N) mod n
用枚举法选择k值,使的
其中,bi=|Si|(i=0,1,…,n-1),Si={x|x∈S, h'(x)=i}。Si是被h'映射为i的关键字集合。
已经证明,满足条件的k值一定存在。
2. 对于每个Si(i=0,1,…,n-1)选择适当的ki,构造函数hi(x)=((kix)mod N) mod Ci。
其中,Ci=1+bi(bi-1),使的hi:Si→[0..Ci-1]为单一映射函数(无冲突)。由于这时的集合Si较小,Ci值也不大,因此ki一定存在,且不难求。
3. 取
,定义函数h: U→[0..m-1],使对于任意X∈S
h(x)=C0+C1+C2+…+Ci-1+((kix) mod N) mod Ci
其中,i=h'(x)=((kx) mod N) mod n。
函数h(x)就是S∈U的一个PHF。
该方法时间代价为(n·N),空间代价为5n+C。
例子:
哈希表总共17格,关键字存放如下