最近在學習資料結構,學到了kmp演算法。起初只知道kmp演算法的目的,就是讓模式串向右滑動盡可能遠的距離,也理解演算法的目的。但是對其中next陣列的含義和求解,還是不太清楚。經過一番思考,恍然大明白,在這裡記錄分享一下。
首先貼乙個我認為比較好理解的說明:如何更好的理解和掌握 kmp 演算法
kmp演算法的核心,是乙個被稱為部分匹配表(partial match table)的陣列。(引用自上述回答)next陣列是乙個長度為n(模式串的長度)的陣列。
next陣列的下標:代表著模式串的子串的長度,子串長度肯定不能為0,所以next陣列有意義的數值是從next[1]開始的,一直到n-1,也就是最大子串的長度。
結合上面所說的,我們計算出每個子串的前字尾最大公共子串長度後,放在從next[1]到next[n-1]的元素中,next[0]的位置放置-1。這樣就是有些文章裡面說的把最大公共子串長度「右移」乙個位置的原因。
知道了next陣列裡面放的是什麼就可以計算它了:
void get_next(string s, int next)
// 不匹配的話,尋找當前長度為i的串的子串的最大公共長度
else
j = next[j];
}}
KMP 演算法 next 陣列理解
可以先看一下阮一峰老師的日誌,kpm演算法 阮一峰日誌 kpm演算法有一步是求next陣列,next i 表示字串s 0.i 中最大相同前字尾的索引。比如字串abcdab,整個字串的最大相同前字尾相是ab,那麼next 5 1。function next s if s i s j 1 return ...
對KMP演算法的next陣列的理解
最近正在看 大話資料結構 在看到kmp演算法的時候怎麼進行字串匹配的基本上可以理解,但是在看原始碼求解next陣列的時候,我蒙了,一頭霧水,和我想象的完全不一樣,真的好簡潔,簡潔到我都不知道為什麼會這樣寫,我試圖 所以然,然後研究了將近三天時間,因此在這僅僅說明我對next陣列的理解。如果理解錯誤的...
KMP演算法 next陣列
通過上文完全可以對kmp演算法的原理有個清晰的了解,那麼下一步就是程式設計實現了,其中最重要的就是如何根據待匹配的模版字串求出對應每一位的最大相同前字尾的長度。我先給出我的 1 void makenext const char p,int next 214 next q k 15 16 現在我著重講...