KMP模式匹配算法求next数组

KMP模式匹配算法是串部分的一个重要算法,需要知道求next和nextval数组的方法


next数组的求法

next数组中规定下标1、2的字符的next数组值是0、1

从下标为3的字符开始,判断P[i-1]=P[next[i-1]]是否成立

即第i个字符的前一个字符是否和第next[i-1]字符是一样的,

若是一样的———next[i]=next[i-1]+1

若不一样————往前继续找,判断P[i-1]=P[next[next[i-1]]]是否成立,成立则有next[i]=next[next[i-1]]+1

不成立时,一直找到下标为1的字符还不相等的话,next[i]=1


KMP模式匹配算法求next数组_第1张图片

例:P“a b a b a a a b a b a a”

现在来看下标为3的a的next求解过程:

P[3-1]=P[2]='b',  P[next[3-1]]=P[1]='a',故等式不成立,由于已经到达下标为1的元素,故next[3]=1

下标为4的b的next求解过程:

P[4-1]=P[3]='a',P[next[4-1]]=P[1]='a',等式成立,则next[4]=next[3]+1=2

下标为5,6的求解过程同上,算出P[5]=3,P[6]=4

下标为7的next求解过程:

P[7-1]=P[6]='a',P[next[6]]=P[4]='b',等式不成立,继续搜寻,P[next[next[6]]=P[2]='b',依旧不成立,还未回到下标1

继续P[next[next[next[6]]]]=P[1]=‘a’,此时等式成立,故next[7]=next[1]+1=2

.....

next[8]=2,next[9]=3,next[10]=4,next[11]=5,next[12]=6

KMP模式匹配算法求next数组_第2张图片


nextval数组求法



1.先求出next数组的值

2.第一位nextval必为0

3.第二位的next[2]=1,故与下标为1的字符比较,b与a不同,故第二位的nextval[2]=next[2]=1

4.第三位的next[3]=1,与下标为1的字符比较,字符相同,故第三位的next[3]=next[1]=0

.....重复步骤

KMP模式匹配算法求next数组_第3张图片

也就是说,第一位固定nextval[1]=0,

从第二位开始,把第i位字符与第next[i]位的字符比较,

若字符相同,则  nextval[i]=nextval[next[i]];

若字符不同,则 nextval[i]=next[i]



KMP算法与BF(普通匹配)算法的比较


假设串长n,模式串长m

BF算法:

时间复杂度O(m*n)

空间复杂度O(1)

KMP算法:

时间复杂度O(m+n)

空间复杂度O(m)    涉及next数组的存储,而next数组是基于模式串长度计算的


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