next陣列
kmp演算法的關鍵在於next陣列的求解,next的值僅取決於子串本身而和主串無關。我們可以從定義分析出發用一種遞推思想求得next的函式值。這裡以陣列下標從0開始為例。
這裡又有一種將子串看成"主串"的思想,利用前面的next資訊,遞推構造後面的值
關鍵**為:
while(j
**示例
#include#define max_size 200
using namespace std;
char p[max_size];
char t[max_size];
int next[max_size+5];
int len1,len2,pos;
void get_next(char *t,int *next)
int main()
{ cin>>p>>t>>pos;
len1=strlen(p);
len2=strlen(t);
int ans=index_kmp(p,t,next);
cout對於get_next函式來說,若t的長度是m,因只涉及到簡單的單迴圈,其時間複雜度為o(m)。而由於i的值不回溯,使得index_kmp()演算法效率得到了提高,其時間複雜度為o(n+m)。相較於樸素模式匹配演算法的o((n-m+1)*m)來說,是要好一些。
需要強調的是,kmp演算法僅當子串與主串之間存在許多「部分匹配」的情況下才能體現出它的優勢,否則兩者差異並不明顯。
get_next函式的改進
有一類情況:例如主串為aaaabcde 子串為aaaaax ,在匹配的過程中會發現有些步驟是多餘的。
因為對於主串和子串大面積相同的情況,next陣列的移動並不明顯,於是我們將**改進
總結改進過的kmp演算法,它是在計算出next值的同時,如果a位字元與它next值指向的b位字元相等,則該a位字元的next就指向b位的next值;如果不等,則該a位的next(改進)的值就是它自己a位的next(原)的值。
KMP匹配 演算法模板
o m n 的字元匹配,其中m是字串的長度,n是匹配串的長度 next陣列預處理 性質 i 1 next i 即字首的長度減去對應的next為字首迴圈節的大小 string pattern 模式子串 vector int next pattern.length 0 next陣列 void next ...
模式匹配 KMP演算法
字串匹配演算法 include includeusing namespace std define ok 1 define error 0 define overflow 2 typedef int status define maxstrlen 255 使用者可在255以內定義最長串長 typed...
模式匹配KMP演算法
前些日子在為目前該學習什麼而苦惱,就問了一下已經從事多年軟體開發的表哥,他說乙個程式設計師要走的遠,就要學好資料結構和演算法,於是我就重新開始學習資料結構和演算法了 拿起以前上過的資料結構看,看到第四章串的模式匹配時,頗感興趣,就寫了一下程式,實踐了一下。感覺還蠻爽,於是就把以下幾個重要的函式放在此...