0

我有一个问题:如果我们让滚动哈希溢出,是否会影响 Rabin-Karp 算法的正确性?您能否举一个可靠的例子说明溢出确实会影响正确性?

这类似于相同的字符串,例如,当您直接从“abcd”或“eabcd”计算时,“abcd”将给出不同的哈希值 (hash("eabc") - hash("e") * R^3) * R +哈希(“d”)

hash("abcd") != (hash("eabc") - hash("e") * R^3) * R + hash("d") 如果我们允许 int/long 溢出

4

2 回答 2

0

我认为这不会影响算法的正确性,因为两个相等的输入在提交给同一个函数时会返回相同的输出。由于滚动哈希添加和减去元素,它不应该影响每个单独的结果,即使它溢出。

于 2020-07-14T23:57:37.483 回答
0

在使用无符号整数进行滚动哈希的情况下,无符号溢出相当于修改 2^32 或 2^64,具体取决于无符号类型的大小。所以你的问题的答案是肯定的,算法仍然是正确的。(作为练习,想一想为什么无符号溢出等同于修改?)

实际上,您会在许多快速实现中看到,它们没有显式使用模运算,而是使用无符号溢出作为隐式模运算来提高速度;例如,请参阅 Charras 和 Lecroq 在 C 中的示例实现:https ://www-igm.univ-mlv.fr/~lecroq/string/node5.html

尽管如此,模运算仍保留在伪代码表示中,只是因为在表示算法时最好明确表示这样的运算,以便于理解和关注细节。

于 2020-07-17T23:35:49.520 回答