最近在看軟件設計師教程,其中有一個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算法是比較好的博客: