Hash

哈希

哈希的思想比较简单,其实就是把一个字符串看做一个高进制的数。

滚动哈希

子字符串匹配,复杂度O(n+m)。

-流程

我盟选取两个合适的互质的常数b和h(b<h),假设字符串为C=$C_1C_2C_3..C_n$那么我们定义哈希函数H(C)=($C_1b^{m-1}+C_2b^{m-2}…+C_mb^0$)mod h

-递推计算

H(C,k)为前k个字符构成的字符串的哈希值,则:(以下不考虑取模)则: \(H(C,K+1)=H(C,k)*b+C_{k+1}\) 递推处理完主字符串(你明白什么意思)的哈希,然后以下是O(1)求子串的哈希 \(H(C')=H(C,k+n)-H(C,k)*b^n\) 这样的时间复杂度是O(m+n);

哈希的正确性

可以使用双哈希来大大降低哈希冲突(两个不同字符串的hash值相等)

附:一些质数

3255433 3255437 3255451 3255467 3255491 3255493 3255529 3255547 3255557 3255559 3255583 3255587 3255601