字首指除了最後乙個字元以外,乙個字串的全部頭部組合,如:對於字串」ababa」,它的字首集合為。
字尾指除了第乙個字元以外,乙個字串的全部尾部組合,對於字串」ababa」,它的字尾集合為。
pmt陣列是乙個被稱為部分匹配表的陣列,pmt中的值是字串的字首集合與字尾集合的交集中最長元素的長度,如:對於字串」ababa」,它的字首集合為,它的字尾集合為, 兩個集合的交集為,其中最長的元素為」aba」,長度為3。
pmt陣列的首位通常設定為0,求pmt陣列的時候,對於模式串的位置j,考察patten[j],查詢字串patten[j]的最大相等的字首和字尾,假設最大相等字首和字尾長度為k,則有k使得 p[0]p[1]p[2]......p[k-2]p[k-1] = p[j-k+1]......p[j-1]p[j]。
生成pmt陣列的程式:
//生成pmt
next陣列的首位通常設定為-1,求next陣列的時候,對於模式串的位置j,考察patten[j-1],查詢字串patten[j-1]的最大相等的字首和字尾,假設最大相等字首和字尾長度為k,則有k使得 p[0]p[1]p[2]......p[k-2]p[k-1] = p[j-k]p[j-k+1]......p[j-2]p[j-1]。
生成next陣列的程式:
//生成next
void makenext(const char p, int next)
else
j = next[j];
}}
kmp模式匹配演算法其實就是利用部分已經匹配的有效資訊,保持主串座標不回溯,通過修改模式串的座標,是模式串盡量移動到有效位置。kmp模式匹配演算法的關鍵就在於next陣列。
kmp模式匹配演算法的**實現:
int kmp(const char t, const char p, int next)
else
j = next[j];
if (j == m)
} return -1;
}
kmp模式匹配演算法改進的重點在於對next陣列的改進,即生成nextval陣列。
從next陣列得到nextval陣列,對於模式串的位置i,若next[i+1]=next[i]+1,則nextval[i]=nextval[next[i]],0<=i<=strlen(p)-1;否則nextval[i] = next[i]。改進過的kmp演算法,它是在計算next值的同時,如果a位字元與它的next值執行的b位字元相等,則該a位的nextval值等於b位的nextval值,如果不等,該a位的nextval值就是它自己a位的next值。
生成next_val陣列**:
void makenextval(const char p,int next_val)
else
j = next_val[j];
}}
模式匹配 KMP演算法
字串匹配演算法 include includeusing namespace std define ok 1 define error 0 define overflow 2 typedef int status define maxstrlen 255 使用者可在255以內定義最長串長 typed...
模式匹配KMP演算法
前些日子在為目前該學習什麼而苦惱,就問了一下已經從事多年軟體開發的表哥,他說乙個程式設計師要走的遠,就要學好資料結構和演算法,於是我就重新開始學習資料結構和演算法了 拿起以前上過的資料結構看,看到第四章串的模式匹配時,頗感興趣,就寫了一下程式,實踐了一下。感覺還蠻爽,於是就把以下幾個重要的函式放在此...
KMP模式匹配演算法
首先,這是由knuth morris和prattle三人設計的線性時間字串匹配演算法。這裡就不仔細的講解,網上有更好的講解,在這推薦幾個自己當時學習的kmp所看到的較好理解的 這裡附上自己所學的 includeusing namespace std s 是主串 p 是模式串 int next 100...