KMP 演算法詳解

2022-06-10 06:03:08 字數 2868 閱讀 6438

kmp 演算法是乙個十分高效的字串查詢演算法,目的是在乙個字串s中,查詢s是否包含子字串p,若包含,則返回ps中起點的下標。

kmp 演算法全稱為 knuth-morris-pratt 演算法,由 knuth 和 pratt 在2023年構思,同年 morris 也獨立地設計出該演算法,最終由三人於2023年聯合發表。

舉乙個簡單的例子,在字串s = ababcabababca中查詢子字串p = abababca,如果暴力查詢,我們會遍歷s中的每乙個字元,若s[i] = p[0],則向後查詢p.length()位是否都相等。這種樸素的暴力的演算法複雜度為 \(o(m \times n)\),其中 \(m\) 和 \(n\) 分別是ps的長度。

kmp 演算法可以方便地簡化這一查詢的時間複雜度,達到 \(o(m + n)\)。

pmt 序列是 kmp 演算法的核心,即 partial match table(部分匹配表)。舉個例子:

charab

abab

caindex01

2345

67pmt00

1234

01pmt 的值是字串的字首集合與字尾集合的交集中最長元素的長度。

現在我們已經知道了 pmt 序列的含義,那麼假設在 pmt 序列已經給定的情況下,如何加速字串匹配演算法?

tar儲存s的下標,從 0 開始,若tar > s.length() - 1, 代表匹配失敗;

pos儲存p的下標,從 0 開始,若s[tar] != p[pos],則pos走到下乙個可能匹配的位置

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