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

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函数值为(  )。

KMP模式匹配算法——next值求解_第1张图片 

求解:

① 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

 

你可能感兴趣的:(软考,kmp)