KMP演算法的next、next value陣列的手工計算

kewlgrl發表於2015-08-11


    昨天下午在書上看到了KMP演算法,看了很多很多很多遍都搞不懂什麼邏輯和原理;今天上午又聽了學長講了一遍感覺沒大聽懂,自己又上網找了很多相關文章,試了很多例子,終於找出來KMP演算法中手工計算next、next value陣列的方法了。下面我藉助網上的相關資料結合用我自己的思路說明一下。


一、什麼是字首字尾? 以字串s"ababcabc"為例:

"a"的字首和字尾都為空集,共有元素的長度為0;

"ab"的字首為[a],字尾為[b],共有元素的長度為0;

"aba"的字首為[a, ab],字尾為[ba, a],共有元素是【a】,長度為1;

"abab"的字首為[a, ab, aba],字尾為[bab, ab, b],共有元素是【ab】長度為2;

"ababc"的字首為[a, ab,aba, abab],字尾為[babc,abc, bc, c],共有元素長度為0;

"ababca"的字首為[a, ab,aba, abab,ababc],字尾為[babca,abca,bca, ca, a],共有元素是【a】,長度為1;

"ababcab"的字首為[a, ab,aba, abab,ababc,ababca],字尾為[babcab,abcab,bcab,cab, ab, b],共有元素是【ab】,長度為2;

"ababcabc"的字首為[a, ab,aba, abab,ababc,ababca,ababcab],字尾為[babcabc,abcabc,bcabc,cabc, abc, bc,c],共有元素的長度為0。


二、計算next陣列

把上面的共有長度按順序寫下來:


將“共有長度”全部整體向後移一位,首項為定值-1,得到next陣列:


三、計算next_value陣列

過程如下(next_value簡記為nv):

首先nv[0]=-1,是一個定值;

s[1]!=s[0],nv[1]=n[1]=0;

s[2]==s[0],nv[2]=nv[0]=-1;

s[3]==s[1],nv[3]=nv[1]=0;

s[4]!=s[2],nv[4]=n[4]=2;

s[5]==s[2],nv[5]=nv[2]=-1;

s[6]==s[3],nv[6]=nv[3]=0;

s[7]==s[4],nv[7]=nv[4]=2;

你們能找出規律嗎?

先將第二項與首項比較:若相同,nv值與首相同;若不同,nv值等於n值。

如果前一次比較結果:若相同,與下一個字元進行比較;若不同,重複比較得出結果;

若比較結果是相同的情況:賦值的nv的下標依次遞加。

可能我表述的不太好,具體請看我上面的步驟,規律是顯而易見的。

綜上,就得到下面這張表:



相關文章