kmp演算法是一種改進的字串匹配演算法,由d.e.knuth,j.h.morris和v.r.pratt同時發現,因此人們稱它為克努特——莫里斯——普拉特操作(簡稱kmp演算法)。kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現乙個next()函式,函式本身包含了模式串的區域性匹配資訊。
接下來我們先分析三張圖,s代表主串,t代表模式串。
當主串s[i]與子串t[j]失配時,i不回溯,僅j回溯到乙個盡量「偏右」的位置k。因此 kpm演算法的核心問題是尋找確定k=n
ext[
j]k=next[j]
k=next
[j]的方法。
由 (i) ,(ii),和 (iii) 我們得到:
t[0 … k-1] = t[j-k … j-1] = t[0 … next[j]-1]
因此得到k = next[j]的定義(注意下標範圍)
以上定義也說明next[j]與主串s無關。
next[j]函式舉例
kmp演算法:
void kmp(int *s, int *t) else
j = next[j];
if (j == m)
}printf("-1\n");
}
根據定義 next[0] = -1;
設 next[j] = k,求 next[j+1]
若 t[j] = t[k],則 next[j+1] = k + 1 = next[j] + 1;
若 t[j] = t[next[k]], 則 next[j+1] = next[k] + 1;
next[j]函式:
void getnext(int *t, int *next) else
k = next[k];}}
運用kmp演算法的匹配過程
解題思路:
解題思路:
解題思路:
解題思路:
KMP演算法詳解
模式匹配的kmp演算法詳解 這種由d.e.knuth,j.h.morris和v.r.pratt同時發現的改進的模式匹配演算法簡稱為kmp演算法。大概學過資訊學的都知道,是個比較難理解的演算法,今天特把它搞個徹徹底底明明白白。注意到這是乙個改進的演算法,所以有必要把原來的模式匹配演算法拿出來,其實理解...
KMP演算法詳解
kmp演算法即knuth morris pratt演算法,是模式匹配的一種改進演算法,因為是名字中三人同時發現的,所以稱為kmp演算法。因為偶然接觸到有關kmp的問題,所以上網查了一下next陣列和 nextval陣列的求法,卻沒有找到,只有在csdn的資料檔案裡找到了next陣列的簡單求法 根據書...
KMP演算法詳解
相信很多人 包括自己 初識kmp演算法的時候始終是丈二和尚摸不著頭腦,要麼完全不知所云,要麼看不懂書上的解釋,要麼自己覺得好像心裡了解kmp演算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。經過七八個小時地仔細研究,終於感覺自己能說出其所以然了,又覺得資料結構書上寫得過於簡潔,不易於初學者接...