t :主串
w:模式串
next[i]:模式串中從第1個字元到第i+1個字元構成的子串的最大字首字尾相等數目。
kmp演算法主要是功能便是判斷模式串是否出現在主串中,並找出相應的出現位置。而在常規的暴力破解演算法中,通常採用順序比對的方法進行查詢,也就是將模式串依次與主串的第1、2、3....個字元比較,直到找出與模式串相等的子串,這樣就會造成資訊的浪費。而
在kmp演算法中,對於每乙個模式串我們會事先計算出模式串的內部匹配資訊,在匹配失敗時最大的移動模式串,以減少匹配次數。
假定主串t:a b a c a
ab a c a b a ta
baca
abac
abam
abac
ab第二次比較: t
abac
aaba
caba
maba
cab
第三次比較:
taba
caab
acab
amab
acab
第一次比較中,在t[5]與w[5]出現了不匹配,而t[0]~t[4]是匹配的,現在t[0]~t[4]就是上文中說的
已經匹配的模式串子串,
現在移動找出
最長的相同的字首和字尾並使他們重疊.而對於移動的步數則由以下公式確定:
移動步數=上一步查詢中相同的字元個數 -m中第乙個不匹配字元的前乙個字元的最大字首字尾數
註解:
首先,字首和字尾的解釋如下
:
如:a b a b a b c
字尾:通俗地說就是所有包含了尾部字元的字串,就是乙個字尾,如c ,bc,abc,都是;
字首:當然是包含了第乙個字元的子串了.
其次,就是在步數的移動上。在上一步的比較中,假設相等的子串為:a b a c a,則該子串的最大字首字尾數為1,也就是字首與字尾相等時,最大的長度為1.也就是說,在主串中從i到i+4,在模式串中從0到4,是分別對應相等的,在下次的移動中,為了盡可能多地增大移動步數,就將模式串中移動到主串該次字首的位置,重新開始比較。
具體實現**如下:(時間很晚了,注釋就明天起來再加)
#include#includeusing namespace std;
void getnext(string w, int *next);
void kmpsearch(string t,string w,int *next);
int main(void)
void kmpsearch(string t, string w, int *next)
if (t[i] != w[j] && j == 0)
if (t[i] == w[j])
if (j == m) }}
void getnext(string w, int *next)
else
} /*for (int i = 0; i < m; i++)*/
}
KMP 演算法研究
定義 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 1 因t 3 t...
KMP演算法研究
本人愚笨,csdn上看了很多解法都不了解,而且很多解法都有些問題。自己看了書研究了乙個晚上才大概明白了這一原理。特此附上自己寫的解法和見解。kmp是對於字串匹配蠻力解法的乙個改進,原理就是在求出模式子串自己內部的重複模式,舉個簡單的例子,主串s ababaababcb 子串t ababc t 0 t...
KMP演算法的研究
前腳學後腳忘,是時候給自己通俗易懂的總結一下了 在電腦科學中,knuth morris pratt字串查詢演算法 簡稱為kmp演算法 可在乙個字串s內查詢乙個詞w的出現位置。乙個詞在不匹配時本身就包含足夠的資訊來確定下乙個匹配可能的開始位置,此演算法利用這一特性以避免重新檢查先前配對的字元。這個演算...