KMP演算法的實現過程

2022-10-10 08:18:09 字數 795 閱讀 9812

樸素的字串匹配演算法的時間複雜度為o(m*n),m、n分別為主串、模式串的長度。容易理解的是,主串和模式串的指標同步進行,當遇到不匹配的字元時,主串指標將移動到當前指標下一位,因此最壞情況下m個字元都要匹配n次。而kmp演算法能在o(m + n)的時間複雜度內完成查詢,原理不再介紹,下面介紹實現過程。

(1)首先在主串與模式串前均新增任一字元,使檢索時索引從1開始。

(2)預處理計算出next陣列以免後來匹配時重複計算。next陣列的作用即當出現主串、模式串不匹配的情況時,模式串指標需要從當前位置j跳轉到next[j]的位置重新進行匹配。計算next陣列的時間複雜度為o(n),n為模式串長度。設i為計算next[i]的主索引,預設next[1] = 0直接跳過,令j = 0,i = 2。開始i++迴圈,若p[i] = p[j + 1],則j向右一位,next[i] = j;若p[i] != p[j + 1],此時跳轉j = next[j],直到j = 0或p[i] = p[j + 1]時停止跳轉,若此時p[i] = p[j + 1],重複上一動作,next[i] = j。

int next = new

int[n + 1];

for(int i = 2, j = 0; i <= n; i++)

(3)計算得到next陣列後進行模式匹配。設i為主串索引,j為模式串索引,令i = 1,j = 0。同樣,如果匹配失敗,則令模式串指標j跳回到next[j]處重新進行匹配,直到匹配成功時,j指標才後移。當j指標到達模式串末尾,說明匹配成功,返回true。

for(int i = 1, j = 0; i <= m; i++)

KMP演算法的實現

概念 knuth morris pratt 字串查詢演算法,簡稱為 kmp 演算法 常用於在乙個文字串 s 內查詢乙個模式串 p 的出現位置,這個演算法由 donald knuth vaughan pratt james h.morris 三人於 1977 年聯合發表,故取這三人的姓氏命名此演算法。...

KMP演算法的實現

kmp演算法的核心就是求子串的重疊的位置 ababc 那麼對於c來說,它前面是abab,所以重疊的子串是ab,所以新位置是2 這都不重要,其他人說得很詳細,我要記錄我的 include include using namespace std 樸素匹配演算法 int match string spar...

KMP演算法實現

核心是模式串next陣列的生成 include stdio.h include string h define ns 100 intstrpos char s1 char s2 intn void next char s2,int n int main intargc,char args next ...