KMP算法思考和分析

KMP算法思考和分析

KMP算法是一个很优秀的算法,其中蕴含了创造者的思考。

KMP算法:KMP算法在执行的过程中对于两个字符串s1和s2,如果s1>s2,那么称s1为主串,s2为模式串,这样分是为了让模式串去在主串之中找位置,为了匹配模式串。

考虑KMP算法的思考过程:

对于子串s1和s2来说:

S1 = a b c d a b e

S2 = a b

1.       

a b a d a b e

=

a b

2.

a b a d a b e

==

a b

3.

a b a d a b e

 a b

4.

a b a d a b e

   =≠

   a b

这个时候,如果再匹配到k的位置,发现已经不满足了,这个时候如果按照BF算法的思想,应该讲模式串右移一位重新开始匹配,但是我们发现a ≠ b,说明右移有效,也就是在模式串中我们就能发现到底是否有效。对于模式串应该移动多少位,我们可以定义next数组,next数组有两种定义的方法:

a  b c  a  b e  a  a  b c   a  a  e

#  0  0  0  1  2  0  1  1  2  3  1  1

这个方法是因为主串和模式串的匹配实际上可以表示为模式串与模式串的自己匹配构成,通过记录自身可以匹配的最长信息,然后就可以实现了KMP算法,但是这个算法是由改进的余地的:

对于

a a a a a a a a

# 0 1 2 3 4 5 6

主串为:

a a a a a a a b aa a a a a a b a a a a a a a b…

对于匹配到b处的时候,会匹配6次,造成极大地浪费,因此next数组可以进行改进:

If(s[i] ==next[s[i]]) next[i] = next[next[i]];

这样可以加速,称之为改进的KMP算法。

存在KMP算法比BF算法运算量大的情况:

具体不太清楚,求大神指教~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值