KR 算法

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.         尽量减少碰撞 即减少如下情况 有字符串XY 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算法的优势所在。

posted @ 2011-03-20 16:52  nosaferyao  阅读(1513)  评论(0编辑  收藏  举报