更快理解KMP演算法

2021-10-25 08:37:43 字數 1097 閱讀 6059

一般的字串比較演算法是暴力匹配

當被比較字串和比較字串失配時 比較字串的當前比較字元轉到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 的執行過程 ...