演算法導論(九)kmp匹配演算法

2021-05-28 06:39:55 字數 609 閱讀 3014

演算法導論第32章

題目:pku1961, pku2406, pku2752

首先舉個例子:要在乙個字串中找到和ababaca匹配的字串的個數.

b a c b a b a b a

a b c b a b

a b a b aca

在這裡前面有5個已經匹配成功,第六個不成功.

通過觀察可以知道,並不需要往後面移動乙個位置繼續比較,實際上可以直接移動兩個位置比較.

a ba b a c a

a b a b a c a 

如果移動乙個位置,可以看到a,b不相等,再移動乙個位置,把前面三個相等的比較下,再比較第四個,當然這就多出了很多時間,也做了很多不必要的工作.

可以通過先計算出字首函式,就不必做多餘的計算了.這樣就達麼了o(n)的時間複雜度.

void kmp_matcher(char *t, char *p)

}}char *compute_prefix_function(char* p)

if (p[k+1] == p[q])

k = k+1;

@[q] = k;

}return @;

}

演算法導論學習筆記 KMP模式匹配

kmp演算法是由knuth,morris和pratt三人設計的線性時間字串匹配演算法。其以 kmp模式匹配演算法之所以能夠快速進行模式匹配,是因為其在模式匹配過程中利用模式串自身的資訊去規避了無用檢測,並因此不需要在失配時進行如樸素模式匹配演算法中的大量的回溯操作。它結合了模式串自身的資訊,並在失配...

演算法 kmp匹配演算法

執行結果 心得收穫 完整 計算next陣列 next陣列的目標是求得從開始到當前位置的字串相同最大前字尾長度為多少 該值的作用是在當前位置的字元匹配失敗時,匹配字串應該從那裡開始繼續匹配,而不用回到開頭 時間複雜的 o m void calnextarray const string str,int...

KMP匹配演算法

1.概述 在講解kmp匹配演算法之前,我們不妨來看看我們用暴力法是怎麼完成字串的匹配的.在我們的目標串t 101011011,和模式串p 110中,我們在t中找尋p第一次出現在t中的下標.通過上圖,我們發現我們利用暴力匹配法,在某次失敗後我們只能非常機械的一步一步移動我們的模式串p.所以我們理解了上...