copy from mail of 方戟
1、 KR算法
a) 算法思路:
通过一个函数{F(n)}计算模式串S和文本串T的一个指纹值,首先比较F(S)和F(Tn)的值,其中(1<=n<=m-n+1)当F(S)和F(Tn)的值相等时,再比较实际的字符串。
该算法需要在T上迭代计算出F(T1),F(T2)….F(Tm-n+1), 依次比较
b) F(n)函数的选择 需要考虑两个问题
1. 尽量减少碰撞 即减少如下情况 有字符串X和Y 且X!=Y 但是F(X)==F(Y)
2. 由于在最坏的情况下需要在文本串T上迭代F函数 m-n+1次, 出于效率的考虑,需要能够快速的计算出F(T1),F(T2)….F(Tm-n+1)
选择的F(n)如下:(具体为什么选择这个可以参见论文)
F(S) = pn-1S1+ pn-2S2+……+ Sn 其中p是一个素数
那么:
F(T1) = pn-1T1+ pn-2T2+……+ Tn
F(T2) = pn-1T2+ pn-2T3+……+ Tn+1
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
F(Tm-n+1) = pn-1Tm-n+1+ pn-2Tm-n+2+……+ Tm
观察到
F(T2) =( (pn-1T1+ pn-2T2+……+ Tn) - pn-1T1)*p+ Tn+1
=(F(T1) - pn-1T1)*p + Tn+1
可归纳为
F(Tn+1) =( (pn-1Tn+ pn-2Tn+1+……+ Tn+n-1) - pn-1Tn)*p+ Tn+n
=(F(Tn) - pn-1Tn)*p + Tn+n (1<=n<=m-n)
=p*F(Tn) - pnTn + Tn+n (1<=n<=m-n)
可见在文本串T中迭代计算F值只需要几次四则运算,效率非常高,这也是KR算法的优势所在。