KMP演算法小結

2021-07-15 22:40:44 字數 1411 閱讀 4293

文字串長度為n,模式串長度為m,匹配過程的時間複雜度為o(n),計算next的o(m)時間,kmp的整體時間複雜度為o(m + n)。

步驟:

文字串s = 「bbc abcdab abcdabcdabde」

模式串p = 「abcdabd」

1.尋找p的 最長公共元素表(前字尾最長序列長度)

失配時,模式串向右移動的位數為:已匹配字元數 - 失配字元的上一位字元所對應的最大長度值

2. 求next 陣列(相當於「最大長度值」 整體向右移動一位,然後初始值賦為-1)

失配時,模式串向右移動的位數為:失配字元所在位置 - 失配字元對應的next值

void getnext(char* p,int next)  

else

} }

優化後

void getnextval(char* p, int next)  

else

} }

3. kmp的演算法流程假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置如果j = -1,或者當前字元匹配成功(即s[i] == p[j]),都令i++,j++,繼續匹配下乙個字元;如果j != -1,且當前字元匹配失敗(即s[i] != p[j]),則令 i 不變,j = next[j]。此舉意味著失配時,模式串p相對於文字串s

向右移動了j - next [j] 位。

int kmpsearch(char* s, char* p)  

else

} if (j == plen)

return i - j;

else

return -1;

}

KMP演算法小結

posted on 2011 06 14 byhuangchao 主要看了這裡,感覺講的十分的不錯,總結一下。首先宣告要搜尋的串為s,設長度為n,要匹配的串為m,設長度為m.先考慮暴力的演算法,暴力的演算法是遍歷s的每乙個字元,然後從這個字元開始和m串進行匹配。時間複雜度為o nm 怎麼在此基礎上進...

KMP演算法小結

主要看了這裡,感覺講的十分的不錯,總結一下。首先宣告要搜尋的串為s,設長度為n,要匹配的串為m,設長度為m.先考慮暴力的演算法,暴力的演算法是遍歷s的每乙個字元,然後從這個字元開始和m串進行匹配。時間複雜度為o nm 怎麼在此基礎上進行優化?假設現在從某個位置 設為s 開始和m串進行匹配,如果匹配不...

KMP演算法小結

假設文字t y1y2y3.yn,模式 p p1p2p3.pm,傳統的匹配演算法把位移為0,1,n m時的文字依次跟p比較,每次比較最多花費o m 的時間,演算法的複雜度為o n m 1 m 傳統模式匹配演算法沒有利用匹配過的資訊,每次都從頭開始比較,速度很慢。而kmp演算法充分利用了之前的匹配資訊,...