为啥 Rabin Karp 算法需要 2 个哈希函数用于模式字符串? (也适用于子字符串)

Posted

技术标签:

【中文标题】为啥 Rabin Karp 算法需要 2 个哈希函数用于模式字符串? (也适用于子字符串)【英文标题】:Why does Rabin Karp algorithm need 2 hash functions for the pattern string? (and also for the substring)为什么 Rabin Karp 算法需要 2 个哈希函数用于模式字符串? (也适用于子字符串) 【发布时间】:2015-01-28 00:23:37 【问题描述】:

例如,我们有 string1:"AB",它必须在 string2:"CABA" 中找到。 对于string1 h1=('A'*27 + 'B') and h2=('A'*29 + 'B'),对于string2我们计算hash1和hash2函数(h2.1='C'*27 + 'A', h2.2='C'*29 + 'C') 我们将结果与 string1 的哈希函数进行比较。

我不明白为什么我们需要 2 个哈希函数,每个字符串或子字符串都有不同的基数。

【问题讨论】:

对我来说这听起来不像 Rabin-Karp。您需要一个滚动哈希,在给定模式 [n..m] 的哈希值的情况下,您可以在恒定时间内计算模式 [n+1...m+1]。 【参考方案1】:

拥有两个不同的哈希函数可以降低发生冲突的可能性,但一个拥有一个哈希函数的版本也可以(我们并不总是需要第二个函数)。

【讨论】:

以上是关于为啥 Rabin Karp 算法需要 2 个哈希函数用于模式字符串? (也适用于子字符串)的主要内容,如果未能解决你的问题,请参考以下文章

模式匹配:滚动哈希到 Rabin-Karp 算法

模式匹配:滚动哈希到 Rabin-Karp 算法

C ++的“map”容器是否对字符串的连续子串应用Rabin-Karp算法?

Rabin-Karp 算法:为啥 h=(h*d)%q

大字符串的 Rabin Karp 算法

算法导论字符串匹配—朴素算法Rabin-Karp有限自动机KMP