MIT算法导论公开课第八讲全域哈希和完全哈希

来源:互联网 发布:怎么自己注册域名 编辑:程序博客网 时间:2024/06/13 12:12

全域哈希      


     对于任意哈希函数而言,都存在一个不好的健集,使得所有的健都会哈希到同一个槽里去,那么如何解决这种情况呢?如何防止对某个键集永远有较差的表现?如何防止竞争对手使用这个键集来降低你的性能表现? 一个词解决这个问题 —— 随机!

全域哈希的方法就是随机选择一个哈希函数H(当然不是每次操作都选择一个哈希函数,而是构建一个哈希表的时候随机选一个,选定之后这个哈希表的所有操作都是基于这个哈希函数,这种方法可以防止竞争对手别有用心的设计一个键集,同时也能避免某些键集永远会导致较差的性能,如果是,那么重新建一个表就行!)

定义:设U为键的全域,H是哈希的有限集,H里面的每个哈希函数h将集合U映射到哈希表的m个位置上,如果哈希表满足:对于U里面的两个值x,y x≠y {h∈H:h(x)=h(y)}=|H|/m,那么H就是全域的。
|H|的意思是指全域哈希函数的个数,那么从里面任意取一个函数h,这个函数把x和y哈希到同一个位置的概率就是1/m,也就是说,这些函数都是均匀函数。

定理:用h来将任意n个键哈希到大小为m的表T里,使用链表法解决冲突,如果关键字k不在表中,则关键字k被哈希到其中链表的长度至多为α。

证明:   是表示与key x冲突的键值数量的随机变量,设   是指示变量,即

则,          ,则

最后结果就等于(n-1)/m。所以总共与x可能有冲突的建小于α个。                                        


完全哈希                                      


当键值是static(即固定不变)的时候,也就是只考虑查询的情况。我们可以设计方案使得最差情况下的查询性能也很出色,这就是完全哈希

完全哈希的思想就是采用两级的框架,每一级上都用全域哈希:


完美哈希的结构如上图。具体来说,第一级和带链表的哈希非常的相似,只是第一级发生冲突后后面接的不是链表,而是一个新的哈希表。

为了保证不冲突,每个二级哈希表的数量是第一级映射到这个槽中元素个数的平方,这样可以保证整个哈希表非常的稀疏。下面给出一个定理,能更清楚的看到设置m=n^2的作用

定理:设H是一类全域哈希函数,哈希表的槽数m=n^2. 那么,如果我们用一个随机函数 把n个关键字映射到表中。冲突次数的期望最多是1/2.

证明:根据全域哈希的定义,对任意选出的哈希函数h,表中2个给定keys冲突的概率是1/m,即1/n^2

且总共有    可能的键值对,那么冲突次数的期望就是     /      证毕!

推论: 完美哈希没有冲突的概率至少是1/2

证明:主要用到马尔科夫不等式:

Pr{X≥t}≤E[x]/t

利用这个不等式,让t=1,即可得到冲突次数大于1的概率最多为1/2


参考:

算法导论

http://www.cnblogs.com/soyscut/p/3396216.html?utm_source=tuicool&utm_medium=referral

http://www.guokr.com/blog/483599/



原创粉丝点击