KMP模式匹配算法——next值求解

j 1 2 3 4 5 6 7 8 
模式串 a b a a b c a c 
next[j] 0 1 1 2 2 3 1 2

各个位的解释 
1.前两位必定为0和1。 
2.计算第三位的时候,看第二位b的next值,为1,则把b和1对应的a进行比较,不同,则第三位a的next的值为1,因为一直比到最前一位,都没有发生比较相同的现象。 
3.计算第四位的时候,看第三位a的next值,为1,则把a和1对应的a进行比较,相同,则第四位a的next的值为第三位a的next值加上1。为2。因为是在第三位实现了其next值对应的值与第三位的值相同。 
4.计算第五位的时候,看第四位a的next值,为2,则把a和2对应的b进行比较,不同,则再将b对应的next值1对应的a与第四位的a进行比较,相同,则第五位的next值为第二位b的next值加上1,为2。因为是在第二位实现了其next值对应的值与第四位的值相同。 
5.计算第六位的时候,看第五位b的next值,为2,则把b和2对应的b进行比较,相同,则第六位c的next值为第五位b的next值加上1,为3,因为是在第五位实现了其next值对应的值与第五位相同。 
6.计算第七位的时候,看第六位c的next值,为3,则把c和3对应的a进行比较,不同,则再把第3位a的next值1

对应的a与第六位c比较,仍然不同,则第七位的next值为1。 
7.计算第八位的时候,看第七位a的next值,为1,则把a和1对应的a进行比较,相同,则第八位c的next值为第七位a的next值加上1,为2,因为是在第七位和实现了其next值对应的值与第七位相同。
--------------------- 
作者:Code_BaiYE 
来源:CSDN 
原文:https://blog.csdn.net/qq_37813928/article/details/69951120 
版权声明:本文为博主原创文章,转载请附上博文链接!

KMP算法简介

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。


求解next [ j ] 值的思路
j-1对应的串与next[ j-1]对应的串进行比较,若相等,则next[ j ]=next[j-1]+1;若不相等,则将j-1对应的串与next[ next [ j-1 ] ]对应的串进行比较,循环直到相等或与next[ 1 ]比较,若都不等,则为next函数中的其他情况。


例子
在字符串的KMP模式匹配算法中,需先求解模式串的next函数值,其定义如下式所示,若模式串p为“aaabaaa”,则其next函数值为(  )。

 

求解:

① next[1]=0,next[2]=1

② 第三位的next值:第2位的模式串为a ,对应的next值为1;将第二位的模式串a与第一位的模式串a进行比较,相等;则next[3]=1+1=2

③ 第四位的next值:第3位的模式串为a ,对应的next值为2;将第三位的模式串a与第二位的模式串a进行比较,相同,则next[4]=2+1=3

④ 第五位的next值:第四位的模式串为b,对应的next值为3;将第四位的模式串b与第三位的模式串a进行比较,不相等;第三位的a对应的next值为2,则将第四位的模式串b与第二位的模式串a进行比较,不相等;第二位的a对应的next值为1,则将第四位的模式串b与第一位的a进行比较,不相等,则next[5]=1(其他情况为1)(若第四位的模式串与第一位的进行比较相等,则next[5]=next[2]+1=1+1=2)

⑤ 第六位的next值:第五位的模式串为a,对应的next值为1;将第五位的模式串a与第一位的模式中a进行比较,相同,则next[6]=1+1=2

⑥ 第七位的next值:第六位的模式串为a,对应的next值为2;将第六位的模式串a与第二位的模式串a进行比较,相等;则next[7]=2+1=3

所以p对应的next值为0123123

 
--------------------- 
作者:iceframemo 
来源:CSDN 
原文:https://blog.csdn.net/iceframemo/article/details/80386405 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(C语言)