模式匹配KMP演算法

2021-07-04 21:01:07 字數 1302 閱讀 4405

前些日子在為目前該學習什麼而苦惱,就問了一下已經從事多年軟體開發的表哥,他說乙個程式設計師要走的遠,就要學好資料結構和演算法,於是我就重新開始學習資料結構和演算法了

拿起以前上過的資料結構看,看到第四章串的模式匹配時,頗感興趣,就寫了一下程式,實踐了一下。感覺還蠻爽,於是就把以下幾個重要的函式放在此處,以便後面檢視和園友學習。

typedef char sstring[max_str_len + 1];//0號單元存放串的長度,可以儲存的數字為-128----127

沒有改進的模式匹配演算法

int index(sstring s,sstring t,int pos)

int i=pos,j=1;

while(i<=s[0]&&j<=t[0])

if(s[i]==t[j])

++i;++j;//繼續往後比較

else//指標後退重新匹配

if(j>t[0])

else return 0;

} //end of index

//模式匹配演算法kmp

//求模式串t的next函式值並存入陣列next

void get_next(sstring t,int next)

int i = 1,j = 0;  next[1] = 0;

while (i < t[0])

if (j==0 || t[i]==t[j])   

else   

//求模式串t的next函式修正值並存入陣列nextval

void get_nextval(sstring t,int nextval)

int i = 1,j = 0;  nextval[1] = 0;

while (i < t[0])  

if (j==0 || t[i]==t[j])

++i;   ++j;

if (t[i] != t[j])

else    

else    

//利用模式串t的next函式求t在主串s中第pos字元之後的位置的kmp演算法//1=

int index_kmp(sstring s,sstring t,int pos,int next)

int i = pos,j = 1;

while (i<=s[0] && j<=t[0])

if (j==0 || s[i]==t[j])

else     

if (j > t[0])

else  

模式匹配 KMP演算法

字串匹配演算法 include includeusing namespace std define ok 1 define error 0 define overflow 2 typedef int status define maxstrlen 255 使用者可在255以內定義最長串長 typed...

KMP模式匹配演算法

首先,這是由knuth morris和prattle三人設計的線性時間字串匹配演算法。這裡就不仔細的講解,網上有更好的講解,在這推薦幾個自己當時學習的kmp所看到的較好理解的 這裡附上自己所學的 includeusing namespace std s 是主串 p 是模式串 int next 100...

KMP模式匹配演算法

思想 盡量利用已經部分匹配的結果資訊,讓i不要回溯,加快模式串的滑動速度。例 如何由當前部分匹配結果確定模式向右滑動的新比較起點k?模式應該向右滑多遠才是高效率的?1 設目前打算與t的第k字元開始比較 則t的1 k 1位 s的i k 1 i 1位 k是追求的新起點 2 剛才肯定是在s的i處和t的第j...