最近我给了一个功课,询问是否给出一个键列表,可以制作一个没有任何冲突的哈希函数。做了一些研究,我发现给定一个预订的键列表,可以实现完美的哈希函数。
然而,除此之外,我不太清楚该说些什么。任何人都可以给我一些关于如何制作完美哈希函数的建议,或者给一个预定义列表确实给哈希函数创建者做了什么,它允许一个完美的函数?
感谢您的帮助。
答案 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*n
将 h
键存储在大小为 Blobcache
的哈希表中,那么发生任何冲突的概率就会降低超过 1/2。”