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)