對KMP演算法的理解

2021-08-26 21:57:45 字數 1152 閱讀 6504

kmp演算法是一種高效的模式匹配演算法,複雜度可以達到o(m+n),而普通模式匹配演算法的複雜度為o(m*n)。

普通模式匹配演算法

從主串的第乙個字元(或者給定的第pos個字元)開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第乙個字元進行比較(即主串需要回退到本次比較開始字元的下一字元,模式串回退到首字元,主串與子串都需要回退)。

匹配成功的標誌:比較到子串的』/0』

匹配失敗的標誌:比較到主串的』/0』,且此時子串的比較位不等於』/0』。

演算法複雜度:o(m*n)

kmp演算法

kmp演算法的改進思路

在普通匹配演算法中子串與模式串都需要回溯,但這些回溯不是必要的。因為當某一位發生失配時,可以根據已匹配的結果進行判斷。該演算法問題可以理解為,當模式串中的第k位與主串的第i位比較時發生不匹配時,需要將模式串向右滑動到**繼續與主串的第i位進行比較?避免了不必要的主串回溯,減少了模式串回溯的位數,從而使演算法複雜度提公升到o(m+n)。

kmp演算法的實現思路

從主串的第乙個字元(或者給定的第pos個字元)開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則將模式串右移至合適的位置,找出模式串中合適的第k位與主串中發生不等的位進行對齊比較。演算法繼續。

模式串與主串對齊繼續比較的第k位必須滿足其前k-1位與主串發生失配位置的前k-1位匹配,且該k-1位字串必須是最長的字串(即不存在k』>k,使模式串中的前k』-1位與主串發生失配位置的前k』-1位匹配,這是為了保證不漏過可以匹配的串)。

該演算法中的主程式同普通的匹配演算法類似,區別在於當發生不匹配時,主串指標不需要回退(不動),將模式串右移到合適的位置繼續進行比較。當模式串移動到第一位(下標為0)仍然不等時,主串指標右移一位。該演算法的關鍵是模式串next的取得。

匹配成功的標誌:比較到子串的』/0』

匹配失敗的標誌:比較到主串的』/0』,且此時子串的比較位不等於』/0』。

next陣列的獲得

next陣列記錄了當模式串第j位發生失配時,模式串需要移動到第k位,使第k位與主串發生失配的位對齊繼續比較(next[j]=k)。next陣列使用遞推實現,假設next[j]=k已經獲得,則從next[j]開始推next[j+1]。具體演算法如下。

假設next[j]=k(第j位及之前的next值已經求得,k

對KMP演算法的理解

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

對KMP演算法的理解

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

對kmp演算法的理解

設有兩個串s和t,在s串中找到乙個與t串相等的子串。我們通常把s稱為目標串,t稱為模式串。在講kmp演算法之前,先回憶一下簡單的暴力匹配演算法。其大概的思路為先從目標串的第乙個字元開始和模式串的第乙個字元相比較,若相等,則比較後續字元,否則從目標串的第二個字元開始重新比較。依此類推,如果匹配成功,輸...