#include<malloc.h>
#include<string.h>
void get_next(SString T,int next[])
{
int i=1,j=0,next[1]=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
++i;
++j;
next[i]=j;
}
else j=next[j];
}
}
next值的求法
例如: 模式串 a b a a b c a c
next值 0 1 1 2 2 3 1 2
next数组的求解方法是:第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。
void get_nextval(SString T,int nextval[])
{
i=1;nextval[1]=0;
j=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
++i,++j;
if(T.ch[i]!=T.ch[j])
nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
nextval值的求法
例如: 主串为“aaabaaaab”、
模式串为“aaaab”
在计算nextval之前要先弄明白,nextval是为了弥补next函数在某些情况下的缺陷而产生的。
例如主串为“aaabaaaab”、模式串为“aaaab”那么,比较的时候就会发生一些浪费的情况:比较到主串以及模式串的第四位时,发现其值并不相等,据我们观察,我们可以直接从主串的第五位开始与模式串进行比较,而事实上,却进行了几次多余的比较。使用nextval可以去除那些不必要的比较次数。
在“aaaab”内进行next及nextval值的验证。
模式串 a a a a b
next值 0 1 2 3 4
nextval值 0 0 0 0 4