字符串RK-Hash
此文转自https://www.cnblogs.com/travelller/p/8318584.html
RK-hash 字符串
1.基本思想
hash基本思想:将Object通过函数转化成数值,则可以通过比较hash值来比较Object是否相等。。
RK-hash基本思想:将字符串转化成数值。
2.具体做法
设有一个字符串S,长度|S|=n,该字符串的字符集的元素个数小于等于d,则字符串S可以看成一个n位的d进制数。
将S的前i位前缀S[0...i]?映射为整数的递推公式为:hash[i]=(hash[i-1]*p+idx(s[i]))%mod
多项式计算:hash[i] = S[i] + d * (S[i-1] + d * (S[i-2] + …+ d * (S[1] + d*S[0])…))
将S的子串S[l...r]映射为整数的公式为:hash[l...r]=(hash[r]-hash[l-1]*(p^(r-1+1)))%mod
3.冲突——不同的字符串映射到同一个整数
虽然是小概率事件,但是有可能出现冲突,解决的方法是:将d选一个较大素数(131),mod选一个大素数(1e9+7、1e9+9=1000000009)
Double hash 也是降低冲突概率的一个方式。即:取两个mod值(如 :1e9+7、1e9+9)分别计算hash值hash1、hash2,用pair<hash1 , hash2>代表一个串。
4.hash+二分
hash字符串常与二分连用(如本题),但是注意!二分的不是hash(混乱不具备单调性),而是字符串的长度。本题是对字符串长度进行二分,判断是否hash值相等。若相等,继续向右判断所求子串是否可以更长,若不相等,向左判断直至hash相等。