Rabin-Karp:滚动哈希计算会向先前计算的哈希添加大质数

时间:2019-05-22 16:40:16

标签: string montecarlo rolling-computation rabin-karp

我认为我从概念上理解使用滚动哈希的RabinKarp模式匹配算法。在进行示例实现here的过程中,我发现一个大质数q被添加到先前计算的滚动哈希中。

for (int i = m; i < n; i++) {
            // Remove leading digit, add trailing digit, check for match. 
            txtHash = (txtHash + q - RM*txt.charAt(i-m) % q) % q; //Why +q here?
            txtHash = (txtHash*R + txt.charAt(i)) % q; 

            // match
            int offset = i - m + 1;
            if ((patHash == txtHash) && check(txt, offset))
                return offset;
        }

我不确定为什么需要这样做。我可以得到一些帮助吗?

在有限的测试中,无论是否包含q字词,我都得到相同的结果。

这与正在执行哪个版本的算法(蒙特卡罗/拉斯维加斯)有关吗?

1 个答案:

答案 0 :(得分:0)

这里有+q这个词是为了避免处理负数。

我们希望txtHash始终位于间隔[0;q[中,如果没有此+q,它也可能位于]q;0[中。

这可能会导致图案丢失。例如patHash = 0xdead,但您计算txtHash = -q+0xdead。这两个值在数学上是相等的mod q,但与Java的% q不同。