了解滚动哈希如何在Rabin Karp算法中使用模数

时间:2016-04-23 17:26:41

标签: string algorithm hash rabin-karp

在通过除以素数将哈希值降低到模数值之后,我无法理解滚动哈希算法的工作原理。

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

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

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

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

因此12345将缩减为23。那么,从那里,我将如何得到下一个窗口的滚动哈希值23456

2 个答案:

答案 0 :(得分:3)

您的计算方法与计算23456的方式相同,但始终使用模101

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

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

答案 1 :(得分:0)

@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:我目前没有足够的“声誉”可将此添加为评论。