全域哈希和完全哈希

看了MIT算法导论公开课关于全域哈希和完全哈希的内容,感觉很棒,因此在这里总结MARK一下

全域哈希

由来

研究一个东西之前,我们首先要知道为什么要研究它,即全域哈希能解决普通哈希的什么问题?

公开课上的例子:如果你和一个竞争对手同时为一家公司做compiler的symbol table, 公司要求你们代码共享,你们做好后公司评判的标准就是 你俩互相提供一些测试样例,谁的效率高就买谁的。
然后普通哈希的缺点就出来了对任意的hash函数h,总存在一组keys,使得,对某个槽i总可以找到一组键值,让他们都映射到同一个槽里面,这样效率就跟离链表差不多了。

解决方法: 加入随机性:独立于键值,随机的选择hash 函数(当然不是每次操作都选择一个哈希函数,而是构建一个哈希表的时候随机选一个,选定之后这个哈希表的所有操作都是基于这个哈希函数,这种方法可以防止竞争对手别有用心的设计一个键集,同时也能避免某些键集永远会导致较差的性能,如果是,那么重新建一个表就行!)。这就跟快排中为避免最差情况时随机化版本差不多。但是选取hash function的全局域是不能乱定的,否则也打不到理想的性能。

全域哈希的定义

设U是key的全局域, 设H是哈希函数的有限集合,每一个都是将U映射到table的m个槽内{0,1,..,m-1}。 如果对所有不等的x,y∈U,集合 { h | h∈H && h(x) = h(y) } 的元素个数等于 |H|/m,则称 H 为全域哈希。即将集合H划分为m份,对于任何两个不相等的key,只有1份包含的hash函数是会使得两者的hash值相等。如下图

全域哈希和完全哈希_第1张图片

换句话说,就是对于任意的不相等key的x和y, 从哈希函数集中选择一个哈希函数,这两个key,发生冲突的概率是1/m。

为什么全域哈希好

定理:设h是从哈希函数全域集H中随机选出的函数h,h被用作把任意n个键映射到表T的m个槽中,对于特定的键值x,

E[与x产生collsion的数量] < n/m

证明:
全域哈希和完全哈希_第2张图片

构造全域哈希

通过上述证明,可以看出全域哈希的优点,那么重点是如何构造全域哈希?,即构造一个hash函数集合H,使得对任意两个不等的键值x,y∈U,集合 { h | h∈H && h(x) = h(y) } 的元素个数等于 |H|/m,下面给出MIT算法导论公开课的构造方法。
全域哈希和完全哈希_第3张图片

证明

构造完上述hash函数集合后,下面证明对于任意一对不等key值,集合 { h | h∈H && h(x) = h(y) } 的元素个数等于 |H|/m。

证明过程如下:

全域哈希和完全哈希_第4张图片

完全哈希

该部分内容转载自(https://www.cnblogs.com/soyscut/p/3396216.html)
当键值是static(即固定不变)的时候,我们可以涉及方案使得最差情况下的查询性能也很出色,这就是完美哈希。实际上,很多地方都会用到静态关键字集合。比如一种语言的保留字集合,一张CD-ROM里的文件名集合。 而完美哈希可以在最坏情况下以O(1)复杂度查找,性能非常出色的。完美哈希的思想就是采用两级的框架,每一级上都用全域哈希。
全域哈希和完全哈希_第5张图片

完美哈希的结构如上图。具体来说,第一级和带链表的哈希非常的相似,只是第一级发生冲突后后面接的不是链表,而是一个新的哈希表。后面那个哈希结构,
我们可以看到前端存储了一些哈希表的基本性质:m 哈希表槽数;a,b 全域哈希函数要确定的两个值(一般是随机选然后确定下来的),后面跟着哈希表。为了保证不冲突,每个二级哈希表的数量是第一级映射到这个槽中元素个数的平方(在第 1 级,如果有 Ni 个元素映射到第 i 个槽,那么第 Ni 个槽对应的 2 级哈希表采用全域哈希。表的长度取 Mi = Ni^2 ),这样可以保证整个哈希表非常的稀疏。

属性:将 n 个键映射到 n^2 个槽,如果从全域哈希 H 中随机选择 h ,那么期望的冲突次数小于 1/2,不发生冲突的概率大于1/2。

上述属性具体证明过程可参考公开课视频,或者【参考2】中的内容。

参考

1.公开课
http://open.163.com/movie/2010/12/3/A/M6UTT5U0I_M6V2TGI3A.html
2.https://www.cnblogs.com/soyscut/p/3396216.html
3.http://blog.csdn.net/qichi_bj/article/details/8469848
4.https://blog.csdn.net/weiyongle1996/article/details/78341669?locationNum=7&fps=1

你可能感兴趣的:(数据结构,算法)