我们想要一种哈希,可以将n个字符串无冲突地匹配到0到n – 1。这种哈希我们称之为完美哈希。
这似乎是难以想象的,冲突是哈希不可以避免的问题,因为我们无法预知每个哈希的值。但是如果需要求解哈希的字符串的集合是预知的,最简单的得到完美哈希的方法就是不断尝试各种哈希方法,直至找到满足我们需求的哈希方法。
但是这个最简单的方法,每次试验获得完美哈希的概率是很小的,将需求退化一点:求一次可以得到n个字符串无冲突地匹配到0到m – 1的哈希的概率F(m, n)。
于是F(m, n) = F(m – 1, n – 1) * [(m – 1) / m]^(n – 1)
可得F(m, n) = (m – 1) * (m – 2) * …*(m – n + 1)/m^(n – 1)
可以看出要m很大才有比较大的可能获得n个字符串无冲突地匹配到0到m – 1的哈希。当m = n时,概率几乎为0.
我们需要寻求一种更好的算法。其实完美哈希的求解有下面的一个概率算法来解决。
预备知识:
1. 当m>2n时,一个m个顶点n条边的随机图是一个无环图的概率近似于sqrt((m-2*n)/m)
2. 一棵树,每条边有一个值。我们可以对每个节点设置一个值,使得每条边的值两个端点的值的和。
(因为树是无环图,所以我们随便找一个点作为起点,随便设置一个值,然后用这个值去生成其他节点的值)
完美哈希:
有了上面的预备知识,生成完美哈希的算法就不难发现了。
1. 随便搞两个哈希函数h1(x), h2(x),哈希的值映射到{0,1,…,n-1}上。
2. 构造一张n个节点的图。对n个字符串生成n对哈希值,对串x生成(h1(x), h2(x)),对节点h1(x), h2(x)连一条边。
3. 检查2中的图是否有环,有环跳到1 。
4. 将图中的n条边赋予0到n - 1的值,对每个节点k根据预备知识的第二点设置一个值g(k),保存下来。
5. 根据h1(x),h2(2),g(x),就可以得到完美哈希h(x) = g(h1(x))+g(h2(x))了。
分享到:
相关推荐
可以实现最小完美哈希查找,及查找时间复杂度为O(1),且load size 为1
用C++实现的完美哈希函数,打印C语言的32个关键字的哈希值,并且判断所输入的字符串是否为关键字
一种基于完美哈希算法的FPGA训练及查询电路实现方法.docx
大数据处理利器 pwwMap 完美哈希
大数据处理利器 pwwMap 完美哈希 没有碰撞 完全取代各种map
mafsa - MA-FSA实现拥有最小完美哈希
完美哈希函数;可以参考一下。改一下哈希函数的公式就变成自己的东西啦
Minperf 最小完美哈希函数库。 主要用Java编写。 包括C版本(当前仅对MPHF进行评估)。 可以在线性时间内生成每个密钥需要少于1.58位的MPHF。 可以以小于100 ns / key的速度生成MPHF,以小于100 ns / key的速度评估...
作业7 最小完美哈希函数
最小完美哈希函数(BDZ 算法) 需要存储 g 数组和 h0, h1, h3 函数 g 中的每个元素都在 [0, 3] 之间所以需要两位 对于一个键,哈希值 = { i = (g[h0(key)] + g[h1(key)] + g[h2(key)]) % 3 return hi(key) }
创建最小的完美哈希函数为给定的键集生成最小的完美哈希函数。 给定的代码模板填充有参数,因此输出是实现哈希函数的代码。 可以轻松地为任何编程语言构造模板。安装最小的完美哈希函数生成器是用纯Python编写的,...
时速 用go编写的最小完美哈希表实现
本文介绍了一种实现实用的完美哈希的方法的实现和经验测试。
triehash:生成器,用于在C中保留订单的最小完美哈希函数
完美哈希这是创建完美哈希函数的尝试基本思想是您创建一个哈希表,但是在发生冲突时,而不是仅仅创建一个列表(这可能导致寻道时间退化为 O(n),而是创建一个新的哈希表! 通过创建一个新的哈希表,您的查找时间保证...
Rust中快速且可扩展的最小完美哈希函数Rust暗示。 该库为可哈希对象的集合生成最小完美哈希函数(MPHF)。 该算法生成消耗约3-6位/项目的MPHF。 构造期间的内存消耗是数据集大小和MPHF最终大小的小数倍(<2x)。 ...
完美哈希函数的设计 基于磁盘的字典存储 4.2 部分指定的查询术语 字符串暴力匹配(Brute-force string matching) 用n-gram索引 循环字典(Rotated lexicon) 4.3 布尔查询(BOOLEAN QUERY) 合取查询(conjunctive ...
完美哈希 用于创建完美哈希表的库。 本自述文件尚在开发中。 用法 通过执行PerfectHashCreate.exe或PerfectHashBulkCreate.exe而无需任何其他参数,即可获得以下用法信息。 Invalid number of arguments for ...
完美哈希函数的设计 176 基于磁盘的字典存储 181 4.2 部分指定的查询术语 182 字符串暴力匹配(Brute-force string matching) 182 用n-gram索引 183 循环字典(Rotated lexicon) 184 4.3 布尔查询(BOOLEAN ...
windows 下编译好的 gperf 完美哈希函数生成器。对于给定的字符串列表,产生哈希函数和哈希表。产生的哈希表没有碰撞,并且查找时只需要一次字符串比较,相当迅速。