KMP演算法詳解

2021-09-25 12:34:53 字數 1367 閱讀 4378

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演算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。經過七八個小時地仔細研究,終於感覺自己能說出其所以然了,又覺得資料結構書上寫得過於簡潔,不易於初學者接...