【算法导论】第八课 全域哈希 完美哈希

哈希表的固有缺点怎么解决?这节课讨论的两个解决哈希表缺陷的方法——全域哈希和完美哈希

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

全域哈希的方法就是随机选择一个哈希函数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的表里,那么对于任意x,与x发生碰撞的概率小于α(装载因子)
证明:设Cx是一个随机变量,表示哈希表T里面,的键和x发生碰撞的总数。
因此Cxy=1 若h(x)=h(y) Cxy=0其他情况 
E[Cxy]=1/m Cx=∑Cxy (y∈T-{x}) E[Cx]=E[Cxy (y∈T-{x})]=(n-1)/m<α
定理得证

构造一个全域哈希函数的证明较繁琐,之后可以详细的讲解。

2.第二个哈希的基本缺陷,即使构造了全域哈希,还是不一定能解决不好的键集输入的问题,能不能找到一个完美的解决方案呢?
能不能保证在任何情况下查找的复杂度都在Θ(1)呢?而且哈希表还不能太大,必须满足n=O(m)
现在来做做推理,如果我们要求对于哈希表中任意一个数x,发生碰撞的次数的期望,小于1
在均匀哈希的情况下,对于每一个数来说,碰撞的可能性都是1/m,那么
Cn2*1/m=n(n-1)/2m <1 那么m>n(n-1)/2 也就是说m是n的平方的量级,所以普通的哈希表是不可能完成这种任务的,除非哈希表构造得非常的大。
解决方案是构造一个双层哈希的结构,哈希表的底层用来存放第二层的入口指针和所用的哈希函数,第二层才是存放数据元素,证明略

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值