无法理解 topcoder 解释的 Rabin Karp 算法的哈希函数
Unable to understand the hash function of Rabin Karp Algorithm explained at topcoder
我正在阅读 Topcoder 的 Rabin Karp 算法。但是在 that 文章中,我无法获得以下哈希评估。
// calculate the hash value of the first segment
// of the text of length m
ht = 0;
for(i = 0; i < m; i++)
ht = int_mod(ht * B + text[i], M);
看起来和理论解释的不一样。我知道我可以自由使用 Rabin Karp 中的任何哈希函数,但仍然要保持教程的流程,我需要解释,因为我可能没有正确理解它。
对我来说,它看起来和之前的理论一样。诀窍是他们以小步骤进行(构造多项式)
考虑一个长度为 3 的字符串的非常简单的示例:
我们初始化ht = 0
。
循环将首先获得位置 0:
ht = text[0]
现在,对于位置 1,我们得到 B
的第一个幂:
ht = text[0]*B + text[1]
。在第三次迭代中,我们通过再次将 B
乘以整个 'polynomial' 得到二次方:ht = text[0]*B^2 + text[1]*B + text[2]
。当然,我们可以在每一步都取模 M
。
这正是文章上面的散列。
我正在阅读 Topcoder 的 Rabin Karp 算法。但是在 that 文章中,我无法获得以下哈希评估。
// calculate the hash value of the first segment
// of the text of length m
ht = 0;
for(i = 0; i < m; i++)
ht = int_mod(ht * B + text[i], M);
看起来和理论解释的不一样。我知道我可以自由使用 Rabin Karp 中的任何哈希函数,但仍然要保持教程的流程,我需要解释,因为我可能没有正确理解它。
对我来说,它看起来和之前的理论一样。诀窍是他们以小步骤进行(构造多项式)
考虑一个长度为 3 的字符串的非常简单的示例:
我们初始化ht = 0
。
循环将首先获得位置 0:
ht = text[0]
现在,对于位置 1,我们得到 B
的第一个幂:
ht = text[0]*B + text[1]
。在第三次迭代中,我们通过再次将 B
乘以整个 'polynomial' 得到二次方:ht = text[0]*B^2 + text[1]*B + text[2]
。当然,我们可以在每一步都取模 M
。
这正是文章上面的散列。