最小完美哈希函数简介

转载 2015年07月09日 15:19:25

http://www.yankay.com/introduction-to-opmphf/

什么是保序最小完美哈希函数

我曾经花了很多脑筋来找一个很好很完美的哈希算法,但都没有想到,最近看到了,掩不住一阵激动分享下。最小完美哈希函数是什么,要从定义说起,这个名字很长,一步步解释。

  1. 哈希函数 任意函数h(x)都可以说哈希函数,一般来说,一个良好的哈希函数可以尽量避免重复。x的集合是参数域,h(x)的集合是值域。
  2. 完美哈希函数  完美哈希函数,就是完全不会冲突的哈希函数,这要求函数的值域至少比参数域要大
  3. 最小完美哈希函数 最小完美哈希函数,就是指函数的值域和参数域的大小完全相等,一个也不多
  4. 保序最小完美哈希函数 保序的意思就是指这个哈希之后顺序是不变的,同时还能满足其他两个条件。
这个函数的优点就是形式上很完美,就像给一个排好序的文档编上的序号一般紧凑可靠。但是这个函数有两个缺点,一是必须事前必须知道原数据集,二是需要花一定的CPU来生成这个函数。我认为,对于数据仓库类的线下搜索应用,这个算法是有用武之地的。但对于强调实时的数据业务,这个算法是不适合的。

算法实现

该算法的实现方法是这样的。先构造两个普通的哈希函数h1(x)和h2(x),还有一个用数组实现的函数g(x)。使得 h(x)=g(h1(x))+g(h2(x))modn ,其中n是参数的总个数,H(x)就是最终的有序最小完美哈希函数了。

以上是定义,说不清楚,举个例子就明白了。取一个n为12的数据集。

首先构造这三个函数:
函数h1和h2:

x h1函数 h2函数
jezebel 5 9
jezer 5 7
... ... ...

函数g:

x g函数
5 0
7 1
9 0
... ...
根据上文的公式 h(x)=g(h1(x))+g(h2(x))modn ,可以得出:
x h计算步骤 h值
jezebel g(5)+g(9) 0
jezer g(5)+g(7) 1
... ... ...

这里的h就可以最小完美哈希函数算出的值了,很神奇,不是吗?

大致的流程走了一遍,现在最最关键的是h1(x),h2(x)和g(x)是怎么得来的。

h1(x)和h2(x)比较简单,可以使用一个很简便的方法获得:先定义一个权重数组w[i],这个数据是一系列随机的数。 h1=(t[1]w[1]+t[2]w[2]+...+t[i]w[i])modm 。其中t[i]指得的字符串x的第i个字符,m值得的函数的值域。只要更换一个权重数组,就可以重新构造一个新函数。有很多方法可以构造这两个函数。

g(x)的获得就比较复杂。可以是凑出来的。就如同上面的例子,因为 g(5)+g(9)mod12=0 , g(5)+g(7)mod12=1 。所以我们可以凑出 g(5)=0,g(7)=1,g(9)=0 这样就可以满足上面的两个条件了。需要一个数组来存储函数g的结果,当然凑也不能瞎凑,是有方法的,下面专门讲凑的步骤。

算法函数生成

首先随意设定一个数,比如是7,设为 g(7)=1 ,因为我们已知 g(5)+g(7)mod12=1 ,所以可以推论出 g(5)=0。因为 g(5)+g(9)mod12=0 ,所以可以推出 g(9)=0 ,以此类推就可以了。但要注意的是千万不能重复设定一个数两次,这样就会形成一个环,永远也推不完。所以遇到已经推算过的数的时候,要检测环的存在。这样下去,就可以猜出全部的值了。

现在需要的就是分析这个凑的过程的运行效率问题。这个就要涉及到h1,h2这两个函数的值域大小,如果越大,越容易凑出一个g函数,但是g函数的参数域就会比较大,存储这个g函数的数据就需要占用更多的空间。相反如果值域越小,在凑的时候就非常容易出现环,需要更长的时间才能凑出这个g函数。

怎么办呢?

我们可以使用3个的h函数来降低形成环的可能,就是这样 h(x)=g(h1(x))+g(h2(x))+g(h3(x))modn ,这样虽然推理g函数的过程会复杂一些,但是很有效,有实验分析表明,当h函数的值域大约参数域的1.23倍的时候,这个g函数的创建尝试次数是常数。

至此,这个算法介绍完了。这个方法是从《Managing Gigabytes》这本书看到的,这里的讲述更浅显一些。

结语

这个哈希函数是一个静态Hash函数,可以非常有效的缩减索引所需要的空间。《Managing Gigabytes》一书中有一个对比,如果直接使用字符串数组,100万个术语需要28MB的空间,而是要这样的哈希函数,可以缩减到12MB。要知道索引小一点,磁盘就能读得快一点,查询就能快一点。所以这个哈希函数对于提高性能是非常给力的。

但是他是静态的,就意味着事前必须知道需要哈希哪些数据。同时生成的算法比较复杂,需要很长的时间来建立索引。没有办法实时添加更新。给他的应用范围提了个极大的限制。窃以为输入法的词库,数据仓库的查询索引,还有一些不需要更新且对性能有要求的场景,这个算法是适用的。



完美哈希函数(Perfect Hash Function)

  什么是完美哈希函数 完美哈希函数(Perfect Hash Function,简称PHF)就是没有冲突的哈希函数,也就是,函数 H 将 N 个 KEY 值映射到 M 个整数上,这里 M>=N ,而...
  • chixinmuzi
  • chixinmuzi
  • 2007年08月05日 18:09
  • 25573

数据结构-最小完美哈希和保序最小完美哈希函数

1.什么是最小完美哈希函数? 在满足完美哈希(不会产生冲突(单射))的前提下,key值数量(假设为n)和哈希表中槽的数量(假设为m)相等,即 m = n,此种哈希函数被称为最小完美哈希函数(其实相当于...
  • tiankong_
  • tiankong_
  • 2017年08月09日 15:43
  • 272

MinHash (最小哈希)

本文转自:http://1.cool.sinaapp.com/?p=893 minhash是判断文档相似的一种方法。这里结合一个具体的示例来简单过一下: 一、全集 {a,b,c,d,e},...
  • yeruby
  • yeruby
  • 2014年12月09日 19:41
  • 3745

完美哈希函数的实现

  • 2011年12月16日 10:58
  • 32KB
  • 下载

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

哈希表的固有缺点怎么解决?这节课讨论的两个解决哈希表缺陷的方法——全域哈希和完美哈希 1.第一个哈希的根本缺陷:对于任意哈希函数而言,都存在一个不好的健集,使得所有的健都会哈希到同一个槽里去,那...
  • lth404391139
  • lth404391139
  • 2015年03月12日 19:30
  • 526

数据结构-最小完美哈希和保序最小完美哈希函数

1.什么是最小完美哈希函数? 在满足完美哈希(不会产生冲突(单射))的前提下,key值数量(假设为n)和哈希表中槽的数量(假设为m)相等,即 m = n,此种哈希函数被称为最小完美哈希函数(其实相当于...
  • tiankong_
  • tiankong_
  • 2017年08月09日 15:43
  • 272

1349 - Optimal Bus Route Design(二分图最小权完美匹配)

该题是一道典型的二分图最小权完美匹配问题 。每个点恰好属于一个有向圈,意味着每个点都有一个唯一的后继 。某个东西恰好有唯一的.....这便是二分图匹配的特点 。 将每个结点拆成Xi和Yi,则原图中的...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2015年08月22日 21:42
  • 955

二分图最佳完美匹配

华电北风吹 天津大学认知计算与应用重点实验室 日期:2016-07-15一、二分图的几个相关定义: 最大匹配:匹配边最多。 完美匹配:所有的顶点全部是匹配点。 最佳完美匹配:边有权重,完美匹...
  • zhangzhengyi03539
  • zhangzhengyi03539
  • 2016年07月15日 14:13
  • 384

MinHash (最小哈希)

本文转自:http://1.cool.sinaapp.com/?p=893 minhash是判断文档相似的一种方法。这里结合一个具体的示例来简单过一下: 一、全集 {a,b,c,d,e},...
  • yeruby
  • yeruby
  • 2014年12月09日 19:41
  • 3745

分治法,最小权完美匹配(巨人和鬼,Ants,uva 1411)

分治法解法: 感觉能用分治法解的问题都有自相似性吧。 就是说把大的情况按某种方式切成几个小的情况,这些小的情况和大的情况是相似的。 如果满足这个条件,那么最简单的情况的解答方案是显然的。 我们...
  • xl2015190026
  • xl2015190026
  • 2016年08月20日 16:42
  • 914
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最小完美哈希函数简介
举报原因:
原因补充:

(最多只允许输入30个字)