rabin算法java_Rabin-Karp字符串匹配算法

Rabin-Karp字符串匹配算法

在实际应用中,Rabin和Karp所提出的字符串匹配算法能够较好的运行,并且还可以从中归纳出相关问题的其他算法,比如二维模式匹配。Rabin-Karp算法的预处理时间是Θ(m),,并且在最坏情况下,它运行的时间为Θ((n-m+1)n)。基于一些假设,在平均情况下,它的运行时间还是挺好的。

为了便于说明,假设∑={0,,1,2,.......,9},这样每个字符都是十进制数。(在通常情况下,可以假定每个字符都是以d为基数表示的数字,其中d=|∑|)我们可以用长度为k的十进制数来表示由k个连续的字符组成的字符串,因此,字符串31415对应着十进制数31415.假如输入的字符既可以看作是图形符号,也可以看作是数字。

给定一个模式p[1...m],假设p便是相应的十进制数,类似的,给定文本T[1...n],假设ts表示长度为m的子字符串T[s+1..s+m]所对应的十进制值,其中s=0,1,..n-m.当然,只有在T[s+1..s+m]=P[1..m]时,ts=p。如果能在时间Θ(m)内计算出p值,并在总时间Θ(n-m+1)内计算出所有的ts值,那么通过比较p和每一个ts值,就能在Θ(m)+Θ(n-m+1)=Θ(n)时间内计算出所有的有效偏移s。

计算出 t0后,可以在Θ(n-m)时间内计算出t1,t2,t3....tn-m

根据公式

ts+1 =10(

ts-10^(m-1) *T[s+1]

) +T[s+m+1]

当于p和t的值可能很大,导致不能方便的对其进行处理。对这个问题有一个简单的补救办法,用一个合适的数q来计算p和t的模。

ts+1 = (d ( ts -T[s + 1]h) + T[s + m + 1 ] ) mod q

ec2725bb78dc7efe69d2dcda66d1bc1c.png

#include#includeusing namespace std;

bool MATCHER(char*T,int s,char *P,int m){

for(int i=0;i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值