【问题标题】:What is the highest suitable integer for rolling modulo hasing?滚动模散列最合适的整数是多少?
【发布时间】:2017-07-29 16:36:59
【问题描述】:

给定一个使用模哈希函数的算法,这意味着大于某个给定整数的大数字将“环绕”,因此结果始终介于 0 和给定整数之间。 例如,Rabin-Karp Algorithm 需要一个滚动哈希,并带有一个巧妙的模数。 可能的最高模数是多少?为什么会这样?

【问题讨论】:

  • 没有可能的最高模数。一般来说,模数越大,哈希值越好,但计算速度越慢。
  • 为什么没有限制?您是否考虑过以 2^(31)-1 为模的 32 位整数?这是行不通的,因为任何足够大的整数乘法都会导致整数溢出,然后才能取模。

标签: algorithm hash modulo rabin-karp


【解决方案1】:

要回答这个问题,检查模调用之间的“最大影响”操作是很重要的。这意味着,如果您期望一个数字最佳地乘以 97*101=9797,则必须将 2^(32) 除以 9797(来自 Rabin-Karp 示例),然后在该区域中寻找最接近的素数。例如,如果将 2600 添加到整数,则必须从 2^(32) 中减去 2600。如果对给定数字求平方,则必须从 2^(32) 等中取平方根。

这将防止在操作之后和模调用之前发生任何溢出。因此,始终将散列数保持在 0 和所选素数之间。

因为您选择了一个(高)素数,所以哈希冲突的次数越少越好。

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 2010-10-14
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多