KMP算法中改进的nextval数组

来源:互联网 发布:河北三金网络 编辑:程序博客网 时间:2024/06/05 11:12

我们在上篇文章中讲到的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];    }}
0 0
原创粉丝点击