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[]数组和Nextval[]数组求法