kmp 演算法是乙個十分高效的字串查詢演算法,目的是在乙個字串s
中,查詢s
是否包含子字串p
,若包含,則返回p
在s
中起點的下標。
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\) 分別是p
和s
的長度。
kmp 演算法可以方便地簡化這一查詢的時間複雜度,達到 \(o(m + n)\)。
pmt 序列是 kmp 演算法的核心,即 partial match table(部分匹配表)。舉個例子:
charab
abab
caindex
01
2345
67pmt
00
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演算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。經過七八個小時地仔細研究,終於感覺自己能說出其所以然了,又覺得資料結構書上寫得過於簡潔,不易於初學者接...