MIT算法导论公开课第八讲全域哈希和完全哈希
2017-10-25 15:04
197 查看
全域哈希
对于任意哈希函数而言,都存在一个不好的健集,使得所有的健都会哈希到同一个槽里去,那么如何解决这种情况呢?如何防止对某个键集永远有较差的表现?如何防止竞争对手使用这个键集来降低你的性能表现? 一个词解决这个问题 —— 随机!全域哈希的方法就是随机选择一个哈希函数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/
相关文章推荐
- 全域哈希和完全哈希——麻省理工算法导论公开课
- 全域哈希和完全哈希
- 全域哈希(Universial Hashing)和完全哈希(Perfect Hashing)
- 全域哈希和完全哈希
- 浅析全域哈希和完全哈希(c语言实现)
- 数据结构-完全hash,二级哈希java实现
- 数据结构-全域哈希及其构造
- POJ 1170 Shopping Offers(完全背包+哈希)
- Hadoop公开课:完全分布式脚本分析
- 【算法导论】第八课 全域哈希 完美哈希
- 算法打基础——HashⅡ: 全域哈希与完美哈希
- 公开课视频与课件(完全免费)-《大企业云桌面部署实战》
- Java中使用MD5、哈希加密
- Android程序完全退出
- U-Boot编译过程完全分析
- hadoop完全分布式安装配置
- 局部敏感哈希(Locality-Sensitive Hashing, LSH)方法介绍
- systemctl 命令完全指南
- NP-完全问题
- EM 无法启动,重新完全配置EM