暑假 實用資料結構 KMP

2021-07-10 20:51:03 字數 630 閱讀 8802

kmp演算法

kmp演算法是字串匹配演算法,可以在o(n)的時間完成,演算法包含兩部分,分別是:構造適配函式與兩串匹配。

失配邊的使用大大提高了演算法效率,可以理解為已經成功匹配的字元不在重新匹配,因為我們已經知道它是什麼,對應到演算法中 匹配失敗後應該在最大字首之後繼續匹配,因為某字尾已與最大字首匹配成功而不用重新比較。

以下為**實現:

1

const

int maxn = 1000 + 5;2

3void getfail(char* p,int* f)11}

1213

//可以如是理解f陣列,f[i]表示到i與字尾成功匹配的最大字首的下一指標

14//

f陣列節約了演算法時間,對於已知(已比較)的字元不在重新比較

1516

void kmp(char* t,char*p) //

成功匹配p,輸出匹配點

25//

將j重調為0代表重新檢查,否則p[j]呼叫出錯 26}

27 }

有趣的是,在這裡發現了作者的乙個小錯誤,如果使字串成功匹配所有位置且kmp演算法可以完成的話,需要加入語句j=0;而在課本中這條語句是沒有的。

暑假 實用資料結構 動態範圍查詢問題

動態範圍查詢問題 一 線段樹 點修改 支援操作 update x,v 將ax修改為v query l,r 計算 l,r 內的最小值 1 intminv maxn 2int ql,qr 3int query int u,int l,int r 10 11int p,v a p v 12void upd...

資料結構 KMP

今天下午實現了kmp演算法 這個演算法算是奇妙,本機器看了10遍左右才基本理解 演算法的核心就是求出next,再依次根據next跳轉,這樣就能線性地匹配出字串 這裡推薦一篇博文說得很好,深入淺出,只是在next陣列是從1開始的,而pattern是從0起始,這也算是前幾次學習的時候沒有理解的地方 今天...

資料結構 KMP演算法

求串的模式值next n 定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元相同,且 j的前面的 1 k個字元與開頭的 1 k個字元不等 或者相等但t k t j 1 k 如 t abcabcad 則next 6...