KMP算法 next nextval函数

#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

猜你喜欢

转载自blog.csdn.net/Davidmvp/article/details/83094476