KMP演算法的學習和理解

2021-10-07 04:02:09 字數 2056 閱讀 7455

首先kmp演算法是主要用來字串匹配

打個比方,比如 現在有字串"bbc abcdab abcdabcdabde",我想要知道這個字串是否包含"abcdabd",那麼正常的匹配就是 用搜尋  詞"abcdabd"從字串"bbc abcdab abcdabcdabde"的"b"開始一直匹配。

如果首字母不對,那麼就開始往後移

當發現從綠色的字母"a", "bbc abcdab abcdabcdabde"開始匹配,

接著,匹配上後就開始繼續匹配,如此類推

一直到匹配到b都匹配成功

但是現在搜尋詞"abcdabd",到匹配"d"的時候就匹配失敗了

於是kmp演算法是利用已知的資訊(已經匹配成功的部分字串),把搜尋詞整段移,這樣就不從把「搜尋詞」移回已經比較過的地方,大大增加了效率

那應該要怎樣移呢,既保證不錯過符合的字串又要保證效率

那麼就誕生了《部分匹配表》,和公式

"部分匹配值"就是"字首"和"字尾"的最長的共有元素的長度。

對應的部分匹配值 這樣算:

我們剛剛的搜尋詞匹配成功的字串是"

abcdab"

那麼可以出現的字串方式是:"a","ab","abc","abcd","abcda","abcdab"

"a"的字首和字尾都是空集             共有元素的長度=0;

"ab"的字首是:[a],字尾是:[b]          共有元素的長度=0;

"abc"的字首是:[a , ab],字尾是:[bc , c]           共有元素的長度=0;

"abcd"的字首是:[a , ab , abc],字尾是:[bcd , bc , c]           共有元素的長度=0;

"abcda"的字首是:[a , ab , abc , abcd ],字尾是:[bcda , cda , da , a]    共有元素為"a",長度為1

"abcdab"的字首是:[a , ab , abc , abcd , abcda ],字尾是:[bcdab , cdab , dab , ab , a]  共有元素為"a","ab" 長度為2

因為 6 - 2 等於4,所以將搜尋詞向後移動4位。

由於a與空格不匹配所以繼續向後移一位

所以現在已匹配值是6,部分匹配值是2,(上面已經列出了abcdab的共有元素為"a","ab" 長度為2),那麼繼續移動4位

完全匹配,包含

其實通過以上的例子,可以發現,

"部分匹配"的實質是,有時候,字串頭部和尾部會有重複。比如,"abcdab"之中有兩個"ab",那麼它的"部分匹配值"就是2("ab"的長度)。搜尋詞移動的時候,第乙個"ab"向後移動4位(字串長度-部分匹配值),就可以來到第二個"ab"的位置。

KMP演算法的理解

串的模式匹配演算法主要有兩種,一是簡單模式匹配,而是kmp演算法。簡單模式匹配演算法很容易理解,每一次從主串的第乙個位置起和模式串的第乙個字元開始比較,如果相等就按照順序一直比下去,如果不相等就把模式串和第二個位置開始繼續進行比較,最後若匹配成功則返回主串中與模式串匹配的第乙個字元的位置,雖然簡單易...

理解KMP演算法

由暴力匹配引入kmp演算法 問題 有乙個文字串s,和乙個模式串p,現在要查詢p在s中的位置。如果用暴力匹配的思路,並假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置,則有 示例 上面s,下面p 比如從a這裡開始匹配上了 一直這樣匹配下去 到這裡匹配不上了 就回滾回去重新開始 這種回滾的問題...

對KMP演算法的理解

kmp演算法是一種高效的模式匹配演算法,複雜度可以達到o m n 而普通模式匹配演算法的複雜度為o m n 普通模式匹配演算法 從主串的第乙個字元 或者給定的第pos個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...