樸素模式匹配演算法就是簡單的二重迴圈,第一重迴圈主串s從1到n,然後第二重迴圈子串t從1到m進行匹配判斷,時間複雜度為o((n-m+1)*m)。
kmp演算法的核心思想是
第一、如果子串前r個字元均不相等,且子串前r個字元與主串某連續的r個字元匹配,但子串第r+1就不匹配了,則主串的匹配下標可以直接向前跳r個,因為這r個字元不可能與子串有匹配的了,在**中體現就是主串下標i不回溯一直+1;
第二、如果子串前r個字元與主串某連續的r個字元匹配,但子串第r+1就不匹配了,且子串前r個字元中有字首串和字尾串匹配相等,則子串下標可以回溯到字首串匹配的下乙個字元下標不用回溯到1,在**中體現就是j回溯到next[j]。
kmp演算法和樸素模式匹配演算法比較:
對於kmp演算法來說,get_next函式若子串t的長度為m,因為只涉及簡單的單迴圈,其時間複雜度為o(m),而由於主串下標i不回溯,使得index_kmp函式中的迴圈的時間複雜度為o(n),因此整個演算法時間複雜度o(m+n)。相較於樸素模式匹配演算法的o((n-m+1)*m),是要好一些。這裡也需要說明的是,kmp演算法僅當模式與主串之間存在許多部分匹配的情況下才能體現出它的優勢,否則二者差異並不明顯。
#includeusing namespace std;
#define maxsize 100
typedef struct str
str;
//向串t插入元素e
void insert(str *t,char e)
//通過計算返回子串t的next陣列,子串t是j從下標1到length,next[j]表示j之前的字串從1到j-1最長的字首與字尾字串相同的字元個數,如果子串j字元與主串pos位置字元不相等,通過next[j]回溯到前面的字元匹配看相不相等。時間複雜度o(m),m是子串t的長度
void get_next(str t,int *next)
int main()
KMP 模式串匹配演算法
這兩天讀了july的kmp,覺得很受益,寫下以作備忘。kmp最重要的就是求出next陣列,而next陣列則是通過不斷比較 str2 k 與 str2 j 來確定下乙個字元對應的 next數值 相等則直接next j k 不相等則令k next k 進行遞推直到出現 str2 k str2 j 相等的...
模式串匹配 KMP演算法
kmp是對字首暴力搜尋的改進,基於的想法其實是很樸素的。首先我們來看一下暴力搜尋。char bf char src,char pattern else if pattern temp 0 return src else return null 如果匹配失敗,則將關鍵字向右滑動乙個字元,從頭開始匹配關...
串的模式匹配 KMP演算法
一 kmp演算法的思想 由d.e.knuth j.h.morris和v.r.pratt共同提出了乙個改進演算法,消除了brute force演算法中串s指標的回溯,完成串的模式匹配。時間複雜度為o s.curlen t.curlen 這就是knuth morris pratt演算法,簡稱kmp 演算...