KMP演算法 基於自動機的理解

2021-08-23 15:24:24 字數 1476 閱讀 9648

kmp 演算法學習總結

kmp 演算法看似簡單,其實想要完全理解還是有困難的。

kmp 其實可以搜尋過程可以看成是乙個自動機,分為 2 部分,第一部分自動機的構造 ( 對應一般的說法就是失效函式,轉移函式, overlap 函式 ) ,第二部分在自動機上搜尋過程。

舉個例子: 目標串味 t = acabaabaabcacaabc; 模式串 p=abaabcac ;

第一步:根據模式串構造自動機

向前的箭頭表示搜尋前進的方向。向後的箭頭表示不匹配的回溯,即失效函式,或者狀態變遷函式。例如:

f(j=1) = 0;

f(j=2) = 0;

f(j=3) = 1;

f(j=4) = 1;

f(j=5) = 2;

f(j=6) = 0;

f(j=7) = 1;

假如已經構造出該自動機,那麼匹配演算法用偽**描述如下:

kmp-search :

int j = 0;   // 指示當前自動機所在狀態

int i;     // 指示目標串匹配過程中的位置

int n;    // 目標串的長度

int m;  // 模式串的長度

for(i =0; i < n; i++)

break; }

else if( j == 0 )   break;    // 如果沒有與 t[i] 匹配,直接 i+1

else j = overlap(j);   // 匹配了一部分出錯的,根據箭頭的指向回溯 }

} 接下裡,就是對失效函式的構造,

kmp-table

overlap(pattern pattern)

return overlap }

演算法實現:

#include using namespace std;

/***kmp-table

*input: pattern

*output : overlap

*/void kmp_table(const char * p, int * overlap)

else if( *** > 0)

*** = overlap[***];

else

}}/**

*kmp_search

*input: char * target ; char * pattern:

*output ; the position of the pattern in traget;

**/int kmp_search(const char * t, const char * p)

cout<

for( int i = 0; i < n; i++)

else if(j == 0) break;

else

}} return -1;

}int main()

kmp與ac自動機

xj比賽做到一道字串題,結果發現想打個字串匹配都只會n 2了,又一次忘記了kmp 想必是當初學這玩意心理陰影面積太大了。這裡再梳理一遍kmp和ac自動機 以便下次再忘了有地方看.kmp 用於處理對於字串s,想知道它在另外某個串哪些位置出現的問題,先做預處理得到乙個失配陣列,這個陣列第i位表示s的前i...

AC自動機(KMP 字典樹)

ac自動機 kmp 字典樹 題目 輸入n個串,判斷有多少個搜尋串的子串 in out 1 47a ababc abcd abcde abcdef abcdefg abcd includeusing namespace std char str 1000000 100 struct node root...

KMP 和 AC 自動機(坑)

xyynb kmp這裡,字串從1開始計數!眾所周知,kmp是一種單串匹配演算法,把樸素演算法的o s t 優化到了o s t 如上圖,在進行樸素演算法時,如果我們已經進行了一些匹配成功,實際上我們就知道了原串的一些資訊,理論上就可以使用這個資訊來加速匹配,跳過一些絕對不可能匹配成功的情況。所以,該怎...