KMP模式匹配演算法

2021-08-11 10:34:32 字數 1049 閱讀 6409

思想:盡量利用已經部分匹配的結果資訊,讓i不要回溯,加快模式串的滑動速度。

例:①如何由當前部分匹配結果確定模式向右滑動的新比較起點k?

② 模式應該向右滑多遠才是高效率的?

(1)設目前打算與t的第k字元開始比較 ,則t的1~k-1位=s的i-(k-1) ~i-1位(k是追求的新起點)

(2)剛才肯定是在s的i處和t的第j字元 處失配,則t的j-(k-1) ~j-1位= s的i-(k-1)~i-1位(1

(1)  next[ j ]的物理意義是什麼?

next[j]函式代表模式t中最大相同字首子串和字尾子串的長度加1。

可見,模式t中相似部分越多,next[j]的值越大。既表示模式t字元之間的相關度越高,也表示j位置以前與主串部分匹配的字元數越多。

即:next[j]越大,模式串向右滑動得越遠,與主串進行比較的次數越少,時間複雜度就越低(時間效率)。

(2)  next[ j ]具體怎麼求?—即kmp演算法的實現

計算next[j]的方法: 

當j=1時,next[j]=0;   

//next[j]=0表示根本不進行字元比較

當j>1時,next[j]的值為:模式串的位置從1到j-1構成的串中所出現的首尾相同的子串的最大長度加1。

無首尾相同的子串時next[j]的值為1。 

// next[j]=1表示從模式串頭部開始進行字元比較

j=1時, next[ j ]≡ 0;//屬於「j=1」情況;

j=2時, next[ j ]≡ 1;// 找不到1

void get_next(sstring t, int  &next[ ] )

模式匹配 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...