筆記 KMP演算法 字串匹配(看貓片)

2022-05-16 21:33:35 字數 1971 閱讀 8825

此篇筆記根據自己的理解和練習心得來解釋演算法,只代表個人觀點,如有不足請指出(我剛學qwq)

設想乙個場景,假設你是乙個淨化網路語言環境的管理員,每天需要翻閱大量的文章和帖子來查詢敏感字,那麼這個時候很簡單的可以想到可以運用字串匹配來做到,但是樸素的單模式字串匹配耗用時間多,那麼在這裡我們就可以運用高效率的\(kmp\)演算法來解決。

樸素的單模式串匹配大概就是列舉每乙個文字串元素,然後從這一位開始不斷向後比較,每次比較失敗之後都要從頭開始重新比對

給定乙個文字串(要查詢符合條件的字串),以及乙個模式串(需要匹配的字串)

模式串:abcab

文字串:abcacababcab

一般的思想就是,當我們在第五位失配時,我們會從當前模式串的第一位所處在文字串的位置的後一位開始與模式串的第一位進行匹配,直到匹配成功位置,就會出現以下的情況

模式串:   abcab

文字串:abcacababcab

這一種演算法的正確性是100%的,但是複雜度顯然不是那麼喜人,一般來說,期望時間複雜度可以為\(o(n+m)\)的,但是一些有心的出題人甚至可以卡到\(o(nm)\),所以這個演算法僅僅用於暴力打法即可。

對於失配以後的字串,不需要去從頭開始列舉浪費時間,而是根據預先處理好的值來進行列舉即可,也就是尋找最優歷史處理,

根據處理的過程,時間複雜度為\(o(n+m)\)

依舊是給定乙個樣例來說明

模式串:abcabc

文字串:abcabdababcabc

在這個樣例中我們可以看到,在第六位的時候失配了,這個時候有乙個\(kmp\)演算法的專門小\(trick\),我們觀察字串可以發現的是,在模式串中,失配的前一位第五位在這整個模式串中可以找到乙個和他相匹配的字元,也就是第二位的\(b\),那麼我們現在就可以把模式串的匹配長度跳轉到\(2\)繼續查詢,那麼為什麼可以這樣做呢,因為我們可以發現,在匹配的時候,第五位的\(b\)之所以可以轉移到第二位,靠的就是以第五位結尾的乙個子串,可以與從\(1-2\)這個範圍內的子串一一對應起來,也就是完全的按位匹配。

那麼轉移過來就是這樣的

模式串:   abcabc

文字串:abcabdababcabc

通過這個方法我們可以節省一大堆無用的時間。

首先設定\(kmp\)陣列為失配陣列,也就是儲存當匹配失敗後跳轉到接下來模式串匹配的最優的位置,因為相比較於文字串,模式串更加的靈活多變,處理起來也很方便,那麼處理失配陣列的時候將模式串當做處理串。

那麼核心就在於如何來處理失配陣列的值

我們要明確的是,在上面條件的基礎上,我們要考慮的是當模式串的第\(i\)為失配以後,如何來調到最優的位置繼續進行匹配,因為在文字串當中\(i\)以前的位置都已經失效了,那麼我們對於每乙個\(kmp_i\)要記錄的是:

在模式串\(str\)中,我們可以找到乙個最優的位置\(j\),滿足\(i\geq j\)並且滿足\(str_i=str_j\),並且在\(j!=1\)的時候,有從\(str_1-str_\)分別與\(str_-str_\)按位匹配。

簡單來說就是在模式串中,存在乙個長度為\(len\)的以\(1\)開頭以\(j\)結尾的子串與以\(i-j+1\)開頭以\(i\)結尾的子串完全相同

#include#include#include#include#include#include#include#includeusing namespace std;

const int n=1e6+9;

int kmp[n],j;

int lena,lenb;

char a[n],b[n];

int main()

j=0;

for(int i=1;i<=lena;i++) }

for(int i=1;i<=lenb;i++)

printf("%d ",kmp[i]);

return 0;

}

KMP演算法 字串匹配

kmp演算法基本思想 我們在用常規的思想做 字串匹配時候是 如 對如 字元如果 t abab 用p ba 去匹配,常規思路是 看 t 第乙個元素 a 是否 和p 的乙個 b 匹配 匹配的話 檢視各自的第二個元素,不匹配 則將 t 串的 第二個元素開始 和 p 的第乙個匹配,如此 一步一步 的後移 來...

KMP字串匹配演算法

kmp核心思想 計算模式串的next陣列,主串的索引在比較的過程中不回朔 ifndef kmp h define kmp h class kmp endif include kmp.h include include include using namespace std int kmp calcu...

KMP字串匹配演算法

在介紹kmp演算法之前,先介紹一下bf演算法。一.bf演算法 bf演算法是普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串p的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和p的第二個字元 若不相等,則比較s的第二個字元和p的第乙個字元,依次比較下去,直到得出最後的匹配...