KMP算法的理解

首先參考阮一峯的KMP博文,簡單明瞭。
網上更多的博文講解next的實現,卻很少有博文認真分析爲什麼需要next,以及next爲什麼要這樣設計,或者說,爲什麼這麼做是可行的。
阮一峯的理解是 如果匹配串頭尾有重複的內容,則在匹配失敗的情況下,直接從頭部移動到尾部。

看完這篇文章以及其他相關文章,我大概知道整個過程該怎麼算,但是仍然不明白這個算法的精髓Next數組爲什麼要這麼做,後來用反證法簡單的證明了一個困擾了一上午的問題。記錄如下:

參考的博文的最後一句話“部分匹配”的實質是,有時候,字符串頭部和尾部會有重複。比如,”ABCDAB”之中有兩個”AB”,那麼它的”部分匹配值”就是2(”AB”的長度)。搜索詞移動的時候,第一個”AB”向後移動4位(字符串長度-部分匹配值),就可以來到第二個”AB”的位置 ”

Question:如果中間存在AB,卻沒有比較,會不會影響結果,例如匹配串如果爲“ABCEABFDAB”在CD中間加了EABF,爲什麼第一個AB不去比較中間的AB,而直接跳到最後的AB,即“爲什麼直接比較最後一個AB是可行的?

Answer: 反證法,如果存在第一個AB移動到第二個AB的位置後完全匹配到模式串,那麼重疊的部分長度就是next[ j ]>2( 這裏畫圖更容易理解)
這和已知的next[ j ]=2矛盾
因此可得,從第一個直接跳轉到最後的是可以的,這裏就是根據匹配串自身的特徵(前綴=後綴的最長長度)。
進一步可得,通過重疊函數分析得到next數組,就是分析匹配串自身的特徵,然後移動的過程中,如果遇到已經匹配了部分前綴,可以通過nextStep=j-next[ j ]的方式 避免重複計算!

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