文字串長度為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演算法充分利用了之前的匹配資訊,...