模式匹配的brute-force演算法和kmp演算法
matrix67部落格--kmp演算法詳解
一、brute-force演算法
brute-force演算法(bf,簡單模式匹配演算法)的基本思想就是:
範例如下:
演算法效率:
易知bf演算法的時間複雜度是o(m*n). 慢的原因主要是:記一次比較時目標串s開始的位置為k,然後模式串p在和目標串s匹配到中途失效的時候,模式串p需要重新指向串開始的位置,更嚴重的是目標串要回退到k+1的位置。----簡而言之,就是雖然模式串和目標串中途匹配了很多字元,直到遇到某個字元失敗,而在重新開始比較時,目標串比較的起始位置需要回退,回退後且只比前一次比較移動了乙個位置。顯然,中途匹配的都是無用功。假定目標串s不動,模式串p在平行於目標串移動,這次失敗讓模式串s相對於目標串p只向右移動了乙個位置。
然後有時明明知道移動乙個位置,也不可能產生正確的結果-----聰明的移動方法(kmp)是,匹配失效時,利用已知資訊,讓模式串s相對於主串p能有盡可能多的向右移動,或者是匹配失敗時,主串指標盡可能少的回退。最壞的情況就是回退到上一次開始的位置的下乙個(bf方法)。如下所示:
二、kmp演算法
kmp演算法(knuth-morris-pratt) 就是前面所說的移動時的」聰明「方法,前提是要求一些已知資訊 ---- 這就是kmp演算法中最重要:對模式串p所構建的 shift 表。 基本演算法思想是:
kmp演算法在matrix67的部落格中講的非常詳細,其部落格中總結的一句話是:掃瞄主串s,並更新可以匹配到模式串p的什麼位置 ----其偽**中的字串下標是從1開始計數
演算法的關鍵:next陣列的確定
這個過程就是前面說的,對模式串p所構建的 shift 表,該過程只和模式串有關。因而可認為:kmp演算法適用於,給定乙個模式串p和一群不同的主串,問模式串p是哪些主串s的子串。
這個過程也可以理解為對模式串p的 自匹配過程。重要的思想就是:對模式串p的某個字元 j,找到其前面的字串p1 p2...pj-1中 max ,該值就是next[j]的值。具體可定義如下(模式串下標從0開始計算,t 即為p)
①next[j]= max 當此集合非空時
②next[j]= 0 其他情況
③next[j]= -1 當 j = 0 時
綜上,kmp演算法的過程分為兩步:第乙個是對模式串p做預處理,根據模式串本身的性質,從尋找前串中的最大 字首==字尾長度,定義出next 陣列;第二個是將模式串p和主串s去比較,當比較到模式串中某個字元j 和主串中字元i 不相等的時候,將j重新置為next[j],再和主串中的i比較 ----- 這樣就保證了,主串指標i 沒有回退的情況。
三、boyer-moore演算法
bm演算法也是適用於單模式快速匹配的方法,演算法的效能是:
具體演算法過程待補充
四、wm演算法--適用於多模式匹配的演算法
主要是涉及到了三個表--shift表、pointer表、prefix表
具體演算法待補充
字串模式匹配
include include include include include includeusing namespace std inline unsigned int64 getclock const char min a const int characters 26 int shiftta...
字串模式匹配
子串的定位操作通常稱作串的模式匹配,是各種串處理系統中最重要的操作之一。設有2 個串 主串 s和子串 t,串的簡單模式匹配演算法是 從主串 s 中的第乙個字元開始和子串 t中的第乙個字元比較,分別用i和 j 指示s串和 t串中正在比較的字元的位置。若相等,則繼續逐個比較後續字元 否則從主串 s的第二...
字串模式匹配
bf演算法 我們常用的暴力演算法,時間複雜度o n2 o n 2 演示 int bf const char text,const char pattern if flag return 1 return 0 kmp演算法 基於bf演算法的優化,他根據字串出現字首與字尾相同的情況進行優化 假設這裡sa...