KMP演算法簡述

2021-06-18 10:29:17 字數 717 閱讀 9424

kmp演算法是模式匹配演算法的一種高效方式,即在乙個字串中查詢是否包含目標的匹配字串。

對於在字串中查詢子串的方法,我們會很自然地想到一種方式。首先把被查詢的字串和要查詢的子串對齊,看第一位是否匹配,如果匹配就看第二位是否匹配。否則,就把子串整體向右滑動一位,再從子串的第一位開始和父串匹配,直到查詢到子串為止。

這樣的乙個演算法看起來很簡單也沒有什麼問題,問題就在於這樣效率比較差,這樣做複雜度是什麼?

於是有了kmp這樣的一種非常巧妙的演算法。kmp的關鍵就在於,當我們發現子串和某一位不匹配時,並不一定要向右移動一位,因為之前的字串我們已經掃瞄過了,有很多情況下我們可以看到,移動一位一定不匹配。問題就是,我們可以往右滑動幾位呢?

部分匹配表是對子串中當前已經匹配的那部分而言的。比如現在我們已經匹配了abcdab這樣乙個子串。那麼,這個子串這部分的部分匹配值就是它的全部字首和全部字尾中最長的共有元素的長度。

- "abcdab"

的字首為

[a, ab, abc, abcd, abcda]

,字尾為

[bcdab, cdab, dab, ab, b]

,共有元素為

"ab"

,長度為

2;(複製自阮一峰的部落格)

kmp匹配的過程和上面描述的過程基本一致,區別就在於,當發生不匹配的情況時,不是右移一位,而是移動(當前匹配的長度– 當前匹配子串的部分匹配值)位。這樣可以省去很多的不必要的匹配,大大提高了效率。

簡述KMP演算法

kmp演算法是一種改進的字串匹配演算法,由d.e.knuth,j.h.morris和v.r.pratt提出的,因此人們稱它為克努特 莫里斯 普拉特操作 簡稱kmp演算法 kmp演算法的核心是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是通過乙個next 函式實...

演算法 KMP演算法

kmp演算法主要解決的問題就是在字串 主串 中的模式 pattern 定位問題。記主串為t,模式串為p,則kmp演算法就是返回p在t 現的具體位置,如果沒有出現則返回 1。如果 i 指標指向的字元和 j 指標指向的字元不一致,那麼把 i 右移1位,j 從0位開始,從新開始匹配 如果 i 指標指向的字...

kmp演算法next例題 KMP演算法next陣列求解

kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...