KMP字串模式匹配演算法詳解

2021-06-26 00:49:28 字數 2145 閱讀 7528

**:

【kmp演算法簡介】

kmp演算法是一種改進後的字串匹配演算法,由d.e.knuth與v.r.pratt和j.h.morris同時發現,因此人們稱它為克努特——莫里斯——普拉特操作(簡稱kmp演算法)。通過乙個輔助函式實現跳過掃瞄不必要的目標串字元,以達到優化效果。

【傳統字串匹配演算法的缺憾】

bill認為,對於一種優化的演算法,既要知道優化的細節,也更應該了解它的前身(至於kmp是否基於傳統演算法,我不清楚,這裡只作語境上的前身),了解是什麼原因導致了人們要去優化它,因此加入了這一段:

請看以下傳統字串匹配的**:

/*

傳統匹配思想是,從目標串target的第乙個字元開始掃瞄,逐一與模式串的對應字元進行匹配,

若該組字元匹配,則檢測下一組字元,如遇失配,則退回到target的第二個字元,重複上述步驟,

直到整個pattern在target中找到匹配,或者已經掃瞄完整個目標串也沒能夠完成匹配為止。

*/

void nativestrmatching(elemtype target, elemtype pattern)            

}

對此函式的詳解,不妨以一例項帶入(建議大家自己手算一下,算完應該就有感覺了),易於理解:

不妨設模式串pattern = "a  b  c  c  a  b  c  c  a  b  c  a"

pattern 陣列編號: 0  1  2  3  4  5  6  7  8  9 10 11

nocm 表示 已經匹配的字元數

lolp 表示 既是自身真字尾又是自身最長字首的字串長度

以下是計算流程:

prefixfunc[1] = 0; //只匹配乙個字元就失配時,顯然該值為零

lolp = 0;   nocm = 2;   lolp = 0;    prefixfunc[2] = 0;

lolp = 0;   nocm = 3;   lolp = 0;    prefixfunc[3] = 0;

lolp = 0;   nocm = 4;   lolp = 0;    prefixfunc[4] = 0;

lolp = 0;   nocm = 5;   lolp = 1;    prefixfunc[5] = 1;

lolp = 1;   nocm = 6;   lolp = 2;    prefixfunc[6] = 2;

lolp = 2;   nocm = 7;   lolp = 3;    prefixfunc[7] = 3;

lolp = 3;   nocm = 8;   lolp = 4;    prefixfunc[8] = 4;

lolp = 4;   nocm = 9;   lolp = 5;    prefixfunc[9] = 5;

lolp = 5;   nocm = 10; lolp = 6;    prefixfunc[10] = 6;

lolp = 6;   nocm = 11; lolp = 7;    prefixfunc[11] = 7;

lolp = 7;   nocm = 12;

---------此時滿足條件while( lolp>0 && (pattern[lolp] != pattern[nocm-1]) )-------------

while語句中的執行

lolp = 0;   nocm = 12; lolp = 1;    prefixfunc[12] = 1;

最後我們的字首函式 prefixfunc =

其間最精妙的要屬失配時的操作

while( lolp > 0 && (pattern[lolp] != pattern[nocm-1]) )

lolp = prefixfunc[lolp];

其中 lolp = prefixfunc[lolp];  遞迴呼叫prefixfunc函式,直到整個p字串都再無最長字首或者找到乙個之前的滿足條件的最長字首。

【應用字首函式優化傳統匹配演算法——kmp演算法實現】

由以上分析,不難推導kmp演算法的實現

void kmpstrmatching(elemtype target, elemtype pattern)            

}

}

KMP字串模式匹配詳解

kmp字串模式匹配詳解 kmp字串模式匹配通俗點說就是一種在乙個字串中定位另乙個串的高效演算法。簡單匹配演算法的時間複雜度為o m n kmp匹配演算法。可以證明它的時間複雜度為o m n 一.簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t in...

KMP字串模式匹配詳解

簡單匹配演算法的時間複雜度為o m n kmp匹配演算法時間複雜度為o m n 一 簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t int pos if else k next k while get nextval 另一種寫法,也差不多。voi...

KMP字串模式匹配詳解

kmp字串模式匹配詳解 kmp字串模式匹配通俗點說就是一種在乙個字串中定位另乙個串的高效演算法。簡單匹配演算法的時間複雜度為 o m n kmp 匹配演算法。可以證明它的時間複雜度為 o m n 一.簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t...