KMP算法中next数组和nextval数组值的推导

来源:互联网 发布:卫星影像下载软件 编辑:程序博客网 时间:2024/05/22 01:29

       提到子串的模式匹配算法就不得不提到大名鼎鼎的KMP算法,而KMP算法的实现离不开next数组或nextval数组,今天我们就来说一下有关next数组和nextval数组求值的问题。

我们先来看下next数组

   首先我们列出next的函数定义:

          0,当j=1时

next[j]=  Max{k|1<k<j,且’p1…pk-1’=’pj-k+1…pj-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数组求值的一些看法,有什么问题欢迎指正。

以上内容参考自《大话数据结构》


原创粉丝点击