0

我试图了解通用散列相对于普通散列的有用性,除了函数每次随机生成,阅读 Cormen 的书。

根据我对通用散列的理解,我们选择要使用的函数

H(x)=[(ax+b)mod p]mod m

其中 p 是大于所有键的素数,m 是数据表的大小,a,b 是随机数。

因此,例如,如果我想读取 80 个人的 ID,并且每个 ID 的值介于 [0,200] 之间,那么 m 将是 80,p 将是 211(下一个素数)。对?我可以使用该功能让我们说

H(x)=[(100x+50)mod 211]mod 80

但为什么这会有所帮助?我很有可能最终会有很多空位,无缘无故地占用空间。降低数字 m 以获得更小的表不是更有用,这样空间就不会无缘无故地使用吗?

任何帮助表示赞赏

4

1 回答 1

0

我认为回答您的问题的最佳方法是从您用于计算哈希码的公式的细节中抽象出来,并更多地考虑通常改变哈希表大小的影响。

您正在考虑调整的参数 m 会调整哈希表中的插槽数。假设您计划将 n 个项目放入哈希表中。比率 n / m 称为哈希表的负载因子,通常用字母 α 表示。

如果您的表格具有高负载系数(α 大,m 小),那么您在表格中浪费的空间就会更少。但是,您也会增加进行查找的成本,因为大量对象分布在一个小空间中,您可能会遇到一堆需要时间来解决的冲突。

另一方面,如果您的表具有低负载因子(小 α,大 m),那么您会降低发生冲突的可能性,因此将提高执行查找的成本。但是,如果 α 变得太小(例如,每个实际存储的元素有 1,000 个插槽),那么您将浪费大量空间。

制作一个好的哈希表的部分工程方面是弄清楚如何在这两个选项之间取得平衡。查看哪些有效哪些无效的最佳方法是拉出分析器并测量对 α 的更改如何更改您的运行时间。

于 2018-12-16T21:40:53.980 回答