KMP算法中改进的nextval数组

Posted 杨东冀@pku

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP算法中改进的nextval数组相关的知识,希望对你有一定的参考价值。


我们在上篇文章中讲到的NEXT数组其实再某些情况下是有缺陷的,例如在模式串 s=’aaaab’ 和主串 t=’aaabaaaab’匹配时,当在i=4,j=4时,产生失配,由下图的next数组中指出还需进行 i=4,j=3;i=4,j=2;i=4,j=1这三次比较。但是我们发现这样的比较是没有意义的,因为s串中前四个字符都相等,所以不需要逐个与主串中的第4个字符进行比较。

所以此时我们应该考虑直接进行i=5,j=1的比较,这就是说,在我们求出next[j]=k时,而模式串中s[j]=s[k],则当匹配字符s[i]和t[j]比较不等时,不需要再进行s[k]和t[j]的比较,而是直接和s[next[k]]比较,换句话说就是如果存在s[j]=s[k]那么next[j]=next[k]。

在模式串中第一位固定有nextval[1]=0,第二位的next[2]应该为1,但是s[1]=s[2],所以我们取nextval[2]=nextval[1]=0,以此类推。

下面给出求nextval的算法:

void get_nextval(SString T,int nextval[])
 i=1; nextval[1]=0; j=0;
 while(i<T[0])
  if(j==0||T[i]==T[j]) 
     ++i;++j;
     if(T[i]!=T[k])
       nextval[i]=j;
     else        
           nextval[i]=nextval[j];
        
        else
       j=nextval[j];
    

以上是关于KMP算法中改进的nextval数组的主要内容,如果未能解决你的问题,请参考以下文章

KMP算法的next[]数组通俗解释

数据结构KMP算法配图详解(超详细)

字符串匹配KMP算法中Next[]数组和Nextval[]数组求法

字符串匹配KMP算法中Next[]数组和Nextval[]数组求法

数据结构-串手算KMP算法的next和nextval数组

hibernate_sqquence.nextval是啥意思呀?