浅显易懂KMP

模式匹配的一种改进算法,是由D.E,Knuth 与V.R.Pratt和J.H.Morris同时发现的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法)。此算法可以在O(n+m)的时间的数量级上完成串的模式匹配操作。改进在于:每当一趟模式匹配过程中出现的字符比较不等时,不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向向右“滑动”尽可能远的一段距离后,继续进行比较。(摘自严蔚敏版《数据结构》)(看完整篇你会懂01112231123456712)

next[j]函数,表明当前模式中第j个字符与主串中响应字符“失配”时,在模式中需重新和主串中欧冠该字符进行比较的字符位置。

next[j]=\left\{\begin{matrix} max\left \{ k|1<k<j,|| 

举个栗子解释一下KMP的过程:

分析:看前面公式当j=1时,next[j]=0;

j=2时,j前面只有一个字符,没有前缀也没有后缀这个就是那个其他情况,next[j]=1。(讲道理,一般前面两个,第一个都是 0,第二个都是 1)

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1          

分析:j=3,我们分别来找前缀和后缀,之前的字符‘a’与‘b’不相等,及 既不是等于0的情况没有找到相同的就是其他情况。

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1 1        

分析:j=4,看这个字符的前面有没有一样的,没有,还是1

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1 1 1      

 


分析:j=5,看这个字符的前面有一样的,这样得到k-1=1;k=2;

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1 1 1 2    

j=6

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1 1 1 2 2  

j=7

j

1 2 3 4 5 6 7

模式串

a b c a a b b

next[j] 

0 1 1 1 2 2 3

图摆在这感觉就差不多了,emmmm出道题  模式串为:abcaabbcaabcaabdab    next[j]序列是多少?

答案见第一段那一串数

看完还不懂私信我能看到就给你一对一讲(叉腰)还有nextval值回头补QAQ(嘟嘟囔囔:感觉应该也没人能看到我这篇)

你可能感兴趣的:(数据结构,数据结构,KMP)