提到子串的模式匹配算法就不得不提到大名鼎鼎的KMP算法,而KMP算法的实现离不开next数组或nextval数组,今天我们就来说一下有关next数组和nextval数组求值的问题。
我们先来看下next数组
首先我们列出next的函数定义:
0,当j=1时
next[j]= Max{k|1
1 其他情况
对于这个函数什么意思我们通过具体的例子来理解
T=”ababcb”
j 123456
模式串T ababcb
next[j] 011231
1) 当j=1时 next[1]=0;
2) 当j=2时 由1到j-1只有一个字符“a”,属于其他情况next[2]=1;
3) 当j=3时 1到j-1是串“ab”,显然“a”与“b”不相等,属其他情况,next[3]=1;
4) 当j=4时 1到j-1是串“aba”,此时前缀字符“a”与后缀字符“a”相等,由此可推算k值等于2(由’p1…pk-1’=’pj-k+1…pj-1’,得到p1=p3),next[4]=2;
5) 当j=5时 1到j-1是串“abab”,此时前缀字符“ab”与后缀字符“ab”相等,k值为前缀字符与后缀字符相等的个数加1,next[5]=3;
6) 当j=6时 1到j-1是串“ababc”,由于前缀字符“a”与后缀字符“c”并不相等,所以属于其他情况,next[6]=1;
我们根据经验可以得到如果前后缀一个字符相等,next[j]值是2,2个字符相等next[j]值是3,n个字符相等next[j]值就是n+1。
还有一种情况要特别注意一下如串“ababac”,当j=6时,由于“aba”与“aba”相等,重叠了一个“a”,此时next[6]=4;
讲完next数组之后,我们再来讲一下nextval数组,我们看下面的例子:
T=”ababaaaba”
j 123456
模式串T ababaa
next[j] 011234
nextval[j] 010104
先算出next数组的值分别为011234,然后再分别判断
1) 当j=1时,nextval[1]=0,这没什么好说的
2) 当j=2时,因为第二位字符“b”的next值为1,所以我们去与第一位字符“a”比较,它们不相等,则nextval[2]=next[2]=1;
3) 当j=3时,第三位字符“a”与第next[3]位(即第一位)字符 “a”相等,所以nextval[3]=nextval[1]=0;
4) 当j=4时,第四位字符“b”与第next[4]位(即第二位)字符 “b”相等,所以nextval[4]=nextval[2]=1;
5) 当j=5时,第五位字符“a”与第next[5]位(即第三位)字符 “a”相等,所以此时nextval[5]=nextval[3]=0;
6) 当j=6时,第六位字符“a”与第next[6]位(即第四位)字符“b”不相等,此时nextval[6]=next[6]=4;
根据以上例子相信你们也能发现规律如下:
nextval[1]永远等于0,之后的第j位字符先去与第next[j]位字符比较,如果相等nextval[j]=nextval[n](n=next[j]),若不相等则nextval[j]=next[j]
以上就是博主关于next数组和nextval数组求值的一些看法,有什么问题欢迎指正。
以上内容参考自《大话数据结构》