KMP算法原理

         KMP算法是對字符串匹配算法的一種簡化。KMP名字的由來是因爲它同時由D.E.Knuth J.H.Morris和V.R.Pratt發現,所以簡稱爲KMP算法。

 

         相對於普通的字符串匹配算法,KMP算法優化了對於已匹配上的串的複用。這也是爲什麼KMP算法在開始匹配之前要計算next數組。

 

         舉個例子:

字符串A:BCDEFBCDASJBCDEFCDAB

字符串B:CDEFCDA

 

         那麼現在我們要從A中找出B子串。如果使用普通的字符串匹配算法,那麼從A串的第一個字符開始,一個一個字符匹配B串中的字符,如果匹配不上,則接着從A串的第二個字符開始重複上述匹配。

而KMP算法在開始匹配之前,我們要計算出一個字符串B的next數組,計算next數組的原因是根據已知的B字符串的內容來計算的,如果A串在某個節點與B串中5個字符匹配上了,在第6個字符上沒有匹配上,那麼對於B來說,A接下來的5個字符其實是已知的。KMP算法利用上一次匹配上了幾個字符串預知知接下來的幾個字的方法來預算是否應該跳過字符,跳過幾個字符。

 

KMP算法next數組計算方法就是看以當前字符結尾的某一個字符串與其前面字符串的最大匹配字符數:


0

0

0

0

1

2

0


不過上面只是爲了促進我們理解而列出的字符串,並不是最終的next字符串,最終的next字符串應該是上面的next數組右移一位,並在開始的位置填入-1:

 

1

0

0

0

0

1

2

也就是說對於CDEFCDA字符串來說,其next數組爲:{-1,0,0,0,0,1,2};

         KMP算法在匹配時,下一次匹配應該向右移動的字符數爲:j-next[j]; j代表當前匹配時正確匹配上的字符數。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章