【发布时间】:2016-09-06 06:53:04
【问题描述】:
我试图在这里理解 Rabin-Karp 算法:http://algs4.cs.princeton.edu/53substring/RabinKarp.java.html。
我浏览了各种文章,现在我知道多项式哈希的一般形式是 C1*A^k-1+C2*A^k-2+C3*A^k-3。看了代码,我明白了他们是如何在字符串中加减数字的。
txtHash = (txtHash + Q - RM*txt.charAt(i-M) % Q) % Q;
txtHash = (txtHash*R + txt.charAt(i)) % Q;
这里的程序是减去前导数字,乘以整个哈希,然后添加新数字。但是,当我查看计算哈希的函数时,它并没有遵循多项式哈希的一般形式。它看起来像这样:
private long hash(String key, int M) {
long h = 0;
for (int j = 0; j < M; j++)
h = (R * h + key.charAt(j)) % Q;
return h;
}
在这个函数中,他们将哈希和基数相乘,然后加上 key.charAt()。我认为该函数会将 key.charAt() 与从 R^k-1 开始的基数相乘。然后随着 for 循环的继续,基数将除以 R 以提供多项式中的递减幂。有人可以解释一下这个函数是如何工作的,以及它是如何以我上面提到的形式生成散列的吗?谢谢!
【问题讨论】:
标签: java hash rabin-karp