在通过除以素数将哈希值降低到模数值之后,我无法理解滚动哈希算法的工作原理。
考虑数字123456
中的5位数序列。
第一个块是12345
。我存储了值,在下一个窗口中,6进来,1出去。
所以新哈希将是(12345-1*10^4)*10 + 6 = 23456
。这非常直观。
很明显,这些数字很大,所以我们需要一个模数函数来保持它们的小。假设我将101
作为素数用于此目的。
因此12345
将缩减为23
。那么,从那里,我将如何得到下一个窗口的滚动哈希值23456
?
答案 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:我目前没有足够的“声誉”可将此添加为评论。