[Algorithm] 哈希

华电北风吹
日期:2017-05-30

哈希由于其高效的时间复杂度得到了很多的应用。
一、关键字查找
这个应该是Hash最基本的应用了。相比于线查的O(n),BST的O(nlog n)的时间复杂度,Hash仅仅需要O(1)的复杂度。

二、信息指纹

任何一段信息,都可以对应一个不太长的随机数,作为区别这段信息和其他信息的指纹。只要算法设计的好,任意两段信息的指纹都很难重复,就如同人类的指纹一样
吴军 “算法之美”

应用1—集合相同的判定
首先,定义集合的信息指纹为集合中各个元素的信息指纹的和。判断两个集合和是否相等只需要判断两个集合的信息指纹是否相等即可。因为两个集合相等,他们的信息指纹必相等。虽然集合不等也有可能信息指纹相等,但是这个概率可以小到忽略。

应用2—cookie
cookie本身就是一种信息指纹。网站可以利用cookie识别不同的用户,但是无法根据cookie了解用户身份。

应用3—判断两个网页是否重复
如果把两个网页按照字符串的方式从头比较到尾,不仅浪费时间,也没必要这么做。比如,如果根据标题,页边等信息的不同判断这两个网页不同就不是十分准确。因此可以找出两个网页中IDF最大的几个词集合,比较这两个集合的信息指纹是否相同即可。除此之外,也可以用下面讲的相似哈希。

三、相似哈希
相似哈希算法可以将一个集合映射到一个整数上,通过判断这个整数是否相等来判断两个集合是否相等。
用一个例子来说明相似哈希算法。
假设一个网页有若干的词 t1,t2,...,tk ,他们的权重(比如TF-IDF值)分别为 w1,w2,...,wk ,每个词的信息指纹为 p1,p2,...,pk ,假设他们的信息指纹二进制长度是 n bit。计算过程中,对每一个二进制位,需要用到一个实数,假设分别为r1,r2,...,rn。计算相似性哈希分为如下两步,
第一步:将这 k 个信息指纹变成n个实数。扫描每一个词 ti(1ik) 的信息指纹,根据其二进制 j(1jn) 位的1/0,来对相应的实数 rj ,进行+/- wi 操作。
第二步:将这 n 个实数变成一个nbit的二进制数, rj0 对应二进制位为1,否则为0。这个二进制数就表示这个集合的相似哈希值。

四、布隆过滤器
布隆过滤器也算是信息指纹的一个应用了。主要用于在使用较少存储的时候,快速判断元素是否在集合中。
布隆过滤器需要一个很长的bit数组和几个不同的信息指纹生成器。对于集合中的每个元素,依次采用信息指纹生成算法,并且把信息指纹对应的bit数组位置置1。在判断的时候,计算该元素所有的信息指纹对应位是否全为1。若”否”,则不在集合中;若”是”,则在集合中。
对于如上的”否”情况,是准确无误的。但是,”是”情况则存在一定概率的误判。即元素不在集合中也有可能被判为在集合中。

五、长短网址转换
在新浪上经常会出现一些特别短的网址,例如 http://t.cn/RS5wUJf
域名t.cn是新浪短网址域名,没什么好说的。在这里主要想说说域名后面这几个字母 RS5wUJf,因为就凭这几个字母就能够定向到它所代表的真正的网址(点开后浏览器地址栏的网址)。
原理猜测:新浪微博里面的需要构造的短网址很少,因此可以利用Hash的方法将微博所涉及到的原始长网址映射到一个短网址上。但是这里有一个问题,Hash操作是不可逆的,那么新浪怎么把短网址解析到正确的长网址上面就是一个问题了,猜测是线查。

六、完美哈希
完美哈希指的是将m个key映射到n个整数上的时候,完全不会冲突的哈希函数。当n==m的时候,称为最小完美哈希。这个概念比较简单,在应用的过程中的难点是怎么寻找到这样一个哈希函数。所以一般都应用在静态集合上,比如编程语言里面的关键字。

七、一致性哈希
一致性哈希主要用于解决分布式环境下的负载均衡问题。在分布式系统中,一组服务器分别存储不同的数据和进行不同的任务计算,共同来完成上传的任务。但是在长时间的运行的过程中,肯定会出现某些机器坏掉,推出集群的情况,这时就需要考虑怎么高效的将该台计算机的计算任务和数据存储等分散到其他计算机中。(可能你自己在使用电脑的过程中出现电脑坏掉的概率很小,但是当集群多了以后,有计算机坏掉的概率就是家常便饭了)。
这其中也有很多算法,对这个感兴趣看看专门相关的文章吧。

参考资料
吴军 “算法之美”
http://www.cnblogs.com/color-my-life/p/5799903.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值