【问题标题】:Understanding how rolling hash works with modulus in Rabin Karp algorithm了解滚动哈希如何与 Rabin Karp 算法中的模一起工作
【发布时间】:2016-08-17 06:44:17
【问题描述】:

在将哈希值除以素数后,我无法理解滚动哈希算法的工作原理。

考虑数字123456 中的5 位数字序列。

第一个块是12345。我存储值,在下一个窗口中,6 进来,1 出去。

所以新的哈希将是(12345-1*10^4)*10 + 6 = 23456。这是相当直观的。

很明显,这些数字很大,所以我们需要一个模函数来保持它们很小。假设我为此目的将101 作为质数。

所以12345 将减少到23。那么,我将如何从中得出下一个窗口 23456 的滚动哈希?

【问题讨论】:

    标签: string algorithm hash rabin-karp


    【解决方案1】:

    您的计算方式与计算 23456 的方式相同,但始终以 101 为模。

    (((23 - (10^4 mod 101))*10) mod 101 + 6) mod 101 = 24.
    

    这是您想要的值,因为23456 mod 101 = 24

    【讨论】:

    • 谢谢。这很容易理解!
    • 你错过了第一个吗?不应该是 (((23 - (1*10^4 mod 101))*10) mod 101 + 6) mod 101 = 24 吗?
    【解决方案2】:

    @dejvuth 的回答是正确的——我会在做 rabin-karp 时特别添加这一点,有时你可能会得到一个 -ve 模值——在这种情况下,最好采用与该模值等效的 +ve - 以便检查之前是否看到相同的模数更容易。

    例如: 使用这种模式"abcdabc" - 和哈希函数: hash(i) = (49*S[i]+7*S[i+1]+1*S[i+2])%1123

    结果:

    "abc" -> 1046
    "bcd" -> 1103
    "cda" -> 33
    "dab" -> 62
    "abc" -> -77
    

    "abc" 结果的第二次出现是-77,它与1046 模等效,因为(-77 + 1123 = 1046)

    PS:我现在没有足够的“声誉”来添加这个作为评论..

    【讨论】:

    • 我非常感谢您的回答。我还不知道模运算,所以我浪费了 2 个小时来基本纠正没有被破坏的东西。
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 2023-03-09
    • 2017-07-27
    • 2018-11-22
    • 2012-01-18
    • 1970-01-01
    • 2016-09-06
    • 2021-05-26
    相关资源
    最近更新 更多