这个问题与rolling-hash非常相似,但是关于溢出/否定结果的一些细节对我来说仍然不清楚。
我也检查了这个 Rabin-Karp实现,并且对下面的行有疑问:
txtHash = (txtHash + Q - RM*txt.charAt(i-M) % Q) % Q;
我了解以下表达式可能会给出否定结果:
txtHash - RM*txt.charAt(i-M)
第一个问题:
如果我们总是添加 Q,一个大素数,这个结果是否会由于溢出而导致负数?
如果不是,为什么不呢?如果是,是否应该仅在结果为负时才进行此添加?
第二个问题:
如果我们暂时不关心负数,写下面的表达式是否正确?
txtHash = (txtHash - RM*txt.charAt(i-M)) % Q;
第三个问题,这部分最让我困惑:
让我们假设当我们添加 Q 时不会发生溢出。为什么在前导数字上有最左边的 % Q 操作?
txtHash = (txtHash + Q - RM*txt.charAt(i-M) % Q ) % Q;
我已经阅读了我链接的答案,并根据 Aneesh 的答案,如果我理解正确,下面的表达式应该是相似的:
hash = hash - ((5 % p)*(10^2 %p) %p)
txtHash = (txtHash + Q - RM*txt.charAt(i-M) % Q) % Q;
但我不明白为什么它们相似,因为在哈希示例中,% p 不是针对先前的哈希值计算的,但是对于 txtHash,我们也计算了先前哈希的 % Q。
慕田峪4524236
相关分类