【发布时间】:2019-10-09 05:13:17
【问题描述】:
我想我在概念上理解使用滚动哈希的 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 术语,我都得到相同的结果。
这是否与正在实施的算法版本(蒙特卡洛/拉斯维加斯)有关?
【问题讨论】:
-
+ q在我看来也是一个错误,因为它值得。 -
@500-InternalServerError 谢谢!您能否解释一下为什么在包含
+q时我们会得到正确的结果?
标签: string montecarlo rolling-computation rabin-karp