最近在看软件设计师教程,其中有一个KMP算法,让求出其next值。书上和网上给出的好多都是别人优化过的算法代码,看起来比较恶心,(不过人家那短短几行代码,却实现了这样一个算法,实在是佩服!!!)网上看了好多别人写的KMP算法中next值得求解,好多都是讲原理的,理解起来比较费时,此文仅献给那些快要考试的孩纸们~
用例子说话:
求子串: a b a a b c a c的next值
位置: 0 1 2 3 4 5 6 7
子串: a b a a b c a c
next值: 0 1 1 2 2 3 1 2
首先前两位一定为0和1接下来看后面几位
第三位(a):看第二位next值是1,将第二位的b与第一位a相比,不同,则为1(如果相同,则为第二位的next值+1)
第四位(a):看第三位next值是1,将第三位的a与第一位的a相比,相同,则为第三位的next值+1=2
第五位(b):看第四位next值是2,将第四位的a与第二位的b相比,不同,而第二位的next值是1,再将第四位的a与第一位的a相比,相同,将第二位的next值+1=2
第六位(c):看第五位的next值是2,则将第五位的b与第二位的b相比,相同,则将第五位的next值+1=3
第七位(a):看第六位的next值是3,将第六位的c与第三位的a相比,不同,而第三位的next值是1,则将第六位的c与第一位的a相比,不同,为1(如果第六位与第一位相比,相同的情况下,第七位的next值应该是第三位的next值+1=2)
第八位(c):看第七位的next值是1,将第七位的a与第一位的a相比,相同,则将第七位的next值+1=2
自己研究了半天,到最后代码也记住了,这里附上恶心的代码(next)~~~
void Get_next(char *p, int next[]){
int i , j , slen;
slen = strlen(p);
i= 0;
next[0] = -1;
j = -1;
while(i <slen){
if(j == -1 || p[i] == p[j]) {
++i ;
++j ;
Next [i]=j ;
}else{
J = next[j] ;
}
}
这个仅仅是用来应付考试的,不过有时间还是好好研究下KMP算法吧,好东西就是好东西,学会了以后说不准就有用!!!看软件设计师的时候,里面好多算法都不会,像什么堆排序,直接插入排序,回溯法什么的···基本都是严蔚敏那本《数据结构》上的,好后悔自己当时上课没听,都睡觉了~~~~
顺便附上我自己看KMP算法是比较好的博客: