【问题标题】:Use of universal hashing使用通用哈希
【发布时间】:2019-05-17 05:35:26
【问题描述】:

我试图了解通用散列相对于普通散列的有用性,除了函数每次都是随机生成的,阅读 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 以获得更小的表不是更有用吗?这样就不会无缘无故地使用空间?

任何帮助表示赞赏

【问题讨论】:

    标签: data-structures hash universal-hashing


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 所以如果我想添加一些元素,m 不应该是元素的数量吧?在上面的例子中,我们想选择一个小于 80 的数字 m,比如 40?
    • 这取决于您的用例以及您使用的哈希表样式。老实说,只有 80 个元素,如果调整内存使用最终对你正在做的任何事情的性能产生任何明显的影响,我会感到惊讶。
    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2014-12-02
    • 2011-02-05
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多