一般的字串比較演算法是暴力匹配
當被比較字串和比較字串失配時 比較字串的當前比較字元轉到0
被比較字串也轉到上個開始匹配的位置+1
這樣比較效率通常是極低的
kmp演算法便是更快速高效的字串比較演算法
kmp演算法關鍵是乙個模式串的最長公共前字尾 明白了這個含義kmp演算法算是理解了大半
**倘若有這樣乙個字串"abcbca"
該字串的字首集合:
a,ab,abc,abcb,abcbc
高字串的字尾集合:
a,ca,bca,cbca,bcbca
看的出該字串的最長前字尾為a 長度為1
上面對於字串abcbca求出了最長公共前字尾的長度為1
那麼對於目標串abcbcd來說在匹配d失陪時 對於abcbca比較串後移多少位才能繼續匹配(kmp演算法是失配時保持被比較串的位置不變 後移比較串來進行字串匹配的)
被比較串: abcbcd…
比較串: abcbca01
2345
6被比較串ab
cbcd
…模式串ab
cbca
看得出來在匹配d失配時 理應把比較串挪到最後繼續匹配
我們在上面算出abcbca的最長公共串的長度為1
然後再來看看失配時比較串挪動後的位置和挪動前的位置的關係01
2345
6789
10挪動前ab
cbca
挪動後abc
bca我們看到重疊了乙個字元 然而這個字元個數剛好是:
對於挪動前而言是最長的字尾公共串
對於挪動後而言則是最長的字首公共串
因為我們計算出最長的公共前字尾長度為1 所以就沒有比較再去比較其他情況了 直接比較最長前字尾都為1的情況即可
例子:0
1234
56模式串abc
abc最長公共前字尾為abc
長度為3
第一次匹配時01
2345
678匹配串ab
cabd
ea模式串abc
abc失配時模式串要到的位置ab
cabc
理解KMP演算法
由暴力匹配引入kmp演算法 問題 有乙個文字串s,和乙個模式串p,現在要查詢p在s中的位置。如果用暴力匹配的思路,並假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置,則有 示例 上面s,下面p 比如從a這裡開始匹配上了 一直這樣匹配下去 到這裡匹配不上了 就回滾回去重新開始 這種回滾的問題...
理解KMP演算法(引用)
理解kmp演算法 引用 通用性的kmp演算法 void getnext st t,int next 由子串t求出next值 else k next k 滑動過程中如果出現不相等則認為以k個字元相等進行下一次滑動 kmpindex st s,st t,int pos maxstrlen為一常量,用來定...
KMP 演算法(個人理解)
相信大家看了 matrix67 的講解,一定已經知道了 kmp 演算法是怎麼回事,怎麼操作的,為什麼時間複雜度不高 這裡,我主要是分享我對 kmp 的理解 kmp 的精髓是什麼?這個東西,各自有個字的理解,很多人都覺得是避免了重複匹配,而我的理解是預處理 為什麼是預處理?你看看 kmp 的執行過程 ...