【发布时间】:2011-11-22 21:21:27
【问题描述】:
我最近收到了一份作业,询问是否可以在给定一个键列表的情况下创建一个没有任何冲突的散列函数。做了一些研究,我发现给定一个预先排序的键列表,完美的哈希函数是可能的。
但是,我不太确定除此之外该说些什么。谁能给我一些关于如何制作完美散列函数的建议,或者究竟给一个预定义列表对允许完美函数的散列函数创建者做了什么?
感谢您的帮助。
【问题讨论】:
标签: function data-structures hash
我最近收到了一份作业,询问是否可以在给定一个键列表的情况下创建一个没有任何冲突的散列函数。做了一些研究,我发现给定一个预先排序的键列表,完美的哈希函数是可能的。
但是,我不太确定除此之外该说些什么。谁能给我一些关于如何制作完美散列函数的建议,或者究竟给一个预定义列表对允许完美函数的散列函数创建者做了什么?
感谢您的帮助。
【问题讨论】:
标签: function data-structures hash
没有冲突的唯一方法是在键和哈希值之间建立一对一的关系。哈希值的范围必须至少与键的数量一样大,并且映射函数必须将每个键转换为唯一值。更多信息在这里:http://en.wikipedia.org/wiki/Perfect_hash
【讨论】:
在 CLRS 书的第 11.5 节“完美哈希”中,我们发现给定一组固定的 n 输入键,我们可以构建一个没有冲突的哈希表。大纲:
如果我们负担得起表大小m = n*n,那么根据该部分中的定理 11.9(引用如下),我们知道我们可以很容易地从一个通用的散列函数类中找到一个散列函数,它给出了没有碰撞。
否则,可以为任何具有 1 个以上键的槽保留“辅助哈希表”。这样的表本身可以基于定理 11.9 的思想来构建,因为现在该槽中的键 nj 的数量很少,因此将是 nj*nj。
定理 11.9,引用:
“如果我们使用从通用散列函数类中随机选择的散列函数h 将n 键存储在大小为m=n*n 的散列表中,那么发生任何冲突的概率小于1/2。”
【讨论】: