kmp演算法為字串匹配時用,能夠實現o(n)的複雜度完成匹配。
我們考慮一般的暴力匹配,其複雜度為o(nm)。
然而它的可以優化的。
任何一種優化都是能夠充分運用已擁有的資訊,kmp演算法亦然。
我們設模板串a,待匹配串b。
它通過乙個關於字串b的next陣列,告訴你當匹配到某位失效的時候,你可以從b串之前的某一位繼續匹配當前a串的某位,而不必從b串第一位開始匹配。
具體的求法,可以用b串來匹配b串來求得。
在這裡的next陣列,個人理解為當第i位可以追溯到第next[i]位,即若在第i+1位匹配失敗時,我們可以回到next[i]位繼續匹配。在這裡,我們令s[i]為b串的前i位字串,則s[next[i]-1]是s[i]的最大前字尾(就是s[i]的字尾的最長字首,如aba是abaaaabb
aba的最大前
字尾,當最後的a的後一位匹配失敗時,我們就回到第3+1位繼續匹配
)
1 #include2 #includekmp要形象理解的可參考另一篇:3using
namespace
std;
4string
qwq,qaq;
5int next[1000008
],m,n;
6void
makenext()14}
15void
kmp()23}
24int
main()
KMP演算法小結
posted on 2011 06 14 byhuangchao 主要看了這裡,感覺講的十分的不錯,總結一下。首先宣告要搜尋的串為s,設長度為n,要匹配的串為m,設長度為m.先考慮暴力的演算法,暴力的演算法是遍歷s的每乙個字元,然後從這個字元開始和m串進行匹配。時間複雜度為o nm 怎麼在此基礎上進...
KMP演算法小結
主要看了這裡,感覺講的十分的不錯,總結一下。首先宣告要搜尋的串為s,設長度為n,要匹配的串為m,設長度為m.先考慮暴力的演算法,暴力的演算法是遍歷s的每乙個字元,然後從這個字元開始和m串進行匹配。時間複雜度為o nm 怎麼在此基礎上進行優化?假設現在從某個位置 設為s 開始和m串進行匹配,如果匹配不...
KMP演算法小結
文字串長度為n,模式串長度為m,匹配過程的時間複雜度為o n 計算next的o m 時間,kmp的整體時間複雜度為o m n 步驟 文字串s bbc abcdab abcdabcdabde 模式串p abcdabd 1.尋找p的 最長公共元素表 前字尾最長序列長度 失配時,模式串向右移動的位數為 已...