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算法的优势所在。

转载于:https://www.cnblogs.com/nosaferyao/archive/2011/03/20/1989561.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值