字符串模式匹配的KMP算法

关于字符串的模式匹配KMP算法

字符串的简单模式匹配算法,效率不够高,因为有很多的比较是没有必要的,所以对比较的次说,通过优化可以减少,从而达到提高效率的目的。

KMP算法由Knuth,Morris,Pratt三人同时发现,所以叫做KMP算法。

 

假设我们有一串字符S :a b c a b c a a b c a b c a b b a c

我们模式字符串是P:a b c a b c a b b a c

简单匹配算法是逐个检验,每次P串往前进1个,来和S串比较,但是有很多情况下,有很多比较是多余的,比如S[1]=P[1],而P[0] ≠P[1]所以P[0]没有必要和S[1]比较。

最好的情况是不重复比较,但是这样又不能保证在前半段匹配成功的部分字符串中,没有能和模式串匹配的。

a b c a b c a a b c a bc a b b a c

ab c a b c a b b a c

例如,在前7个字符中标绿的子字符串还能匹配,如果跳过的话,肯定会造成结果的不准确。

 

所以KMP算法就是来寻找像标绿这样的子字符串的方法

现在我们需要从S中搜索,看有没有字串P

首先我们来定义前缀字串和后缀字串(其实就是上述标绿的字符串)

设j为比较串的当前比较位置

设i为模式串的当前位置

a b c a b c a ab c a b c a b b a c        j=7

a b c a b c a bb a c                  i=7

我们从头开始比较,发现从标红的地方,开始不一样了,在标红之前是一样的即

a b c a b c a

设前缀和后缀字串的长度为k

k1时,即 a——a

2时a b—— c a

3时a b c——b c a

4a b c a——a b c a

5时a b c a b——c a b c a

6时a b c a b c——b c a b c a

注意,当比较到6的时候就结束比较,比较到k=j-1的时候停止,我们发现当k=1或4的时候,前缀和后缀相同,我们取最大值k=4,即调整j=4

a b c a b c a ab c a b c a b b a c

a b c a b c ab b a c

这样比较就减少了比较次数,提高了算法的效率

    原文作者:KMP算法
    原文地址: https://blog.csdn.net/wayway0554/article/details/63426431
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞