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 如上圖,在進行樸素演算法時,如果我們已經進行了一些匹配成功,實際上我們就知道了原串的一些資訊,理論上就可以使用這個資訊來加速匹配,跳過一些絕對不可能匹配成功的情況。所以,該怎...