KMP算法next值求解


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

http://www.cnblogs.com/tangzhengyue/p/4315393.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM