KMP演算法小結

2022-07-18 04:33:13 字數 1119 閱讀 3781

kmp演算法為字串匹配時用,能夠實現o(n)的複雜度完成匹配。

我們考慮一般的暴力匹配,其複雜度為o(nm)。

然而它的可以優化的。

任何一種優化都是能夠充分運用已擁有的資訊,kmp演算法亦然。

我們設模板串a,待匹配串b

它通過乙個關於字串bnext陣列,告訴你當匹配到某位失效的時候,你可以從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]的字尾的最長字首,如abaabaaaabb

aba的最大前

字尾,當最後的a的後一位匹配失敗時,我們就回到第3+1位繼續匹配

1 #include2 #include

3using

namespace

std;

4string

qwq,qaq;

5int next[1000008

],m,n;

6void

makenext()14}

15void

kmp()23}

24int

main()

kmp要形象理解的可參考另一篇:

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的 最長公共元素表 前字尾最長序列長度 失配時,模式串向右移動的位數為 已...