通用哈希的使用

时间:2018-12-16 18:34:17

标签: data-structures hash universal-hashing

我正在尝试理解通用散列相对于普通散列的有用性,而不是每次都会随机生成函数,请阅读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以得到更小的表,这样就不会因为没有原因而没有使用空间呢?

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

我认为,回答您问题的最佳方法是抽象化您用于计算哈希码的公式的详细信息,并进一步考虑更改哈希大小的影响桌子。

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

如果您的表具有较高的负载系数(大α,小m),则表中的浪费空间将更少。但是,由于将许多对象分配到一个很小的空间中,您很可能会遇到一堆冲突,而这些冲突需要花费一些时间才能解决。

另一方面,如果您的表具有低负载系数(小α,大m),则可以减少发生冲突的可能性,从而可以提高执行查找的成本。但是,如果α太小-例如,每个元素实际存储1000个插槽-那么就会浪费很多空间。

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