完美的哈希函数

时间:2011-11-22 21:21:28

标签: function data-structures hash

最近我给了一个功课,询问是否给出一个键列表,可以制作一个没有任何冲突的哈希函数。做了一些研究,我发现给定一个预订的键列表,可以实现完美的哈希函数。

然而,除此之外,我不太清楚该说些什么。任何人都可以给我一些关于如何制作完美哈希函数的建议,或者给一个预定义列表确实给哈希函数创建者做了什么,它允许一个完美的函数?

感谢您的帮助。

2 个答案:

答案 0 :(得分:9)

没有冲突的唯一方法是在密钥和哈希值之间建立一对一的关系。散列值的范围必须至少与键的数量一样大,并且映射函数必须将每个键转换为唯一值。这里有更多信息:http://en.wikipedia.org/wiki/Perfect_hash

答案 1 :(得分:0)

在 CLRS 书籍的第 11.5 节“完美散列”中,我们发现给定一组固定的 n 输入键,我们可以构建一个没有冲突的散列表。大纲:

  • 如果我们能负担得起表大小 m = n*n,那么基于该部分中的定理 11.9(下面引用),我们知道我们可以很容易地从哈希的通用类中找到一个哈希函数——函数,不会产生冲突。

  • 否则,可以为具有超过 1 个键的任何插槽保留“辅助哈希表”。这样的表本身可以基于定理 11.9 的思想来构建,因为现在该槽中的键 nj 的数量很小,因此 nj*nj 的数量将是 n

定理 11.9,引用: “如果我们使用从通用哈希函数类中随机选择的哈希函数 m=n*nh 键存储在大小为 Blobcache 的哈希表中,那么发生任何冲突的概率就会降低超过 1/2。”