KMP的簡單實現和理解

2021-10-02 12:53:25 字數 1351 閱讀 1071

在沒介紹之前我們先上乙個bf的字串匹配演算法的**

#include

#include

#include

using namespace std;

void

bao(

char a,

char b)

else

if(j==x)}}

intmain()

執行結果:執行結果為從0開始的下標

因為kmp是上面這個**的優化版,所以因先看懂這個

而上圖就類似上面**的運**況

下面我們說kmp,而kmp就是減少傳統演算法所用的時間

而下圖就是kmp演算法的運**況:

但我們要怎樣才能達到這樣的目的呢?

這時候就要借用到next這個陣列了

next可以由圖看出是字首和字尾相同個數加一

則求next的**為:

下面就是next

void

gene

(char p,

int x)

else

}}

其實求next時的**還有另一種寫法

void

gene

(char p,

int x)

else

}}

其他部分與傳統的演算法差不多

完整**為:

#include

#include

#include

#define n 100

using namespace std;

int w[n]

;void

gene

(char p,

int x)

else}}

void

abc(

char a,

char b)

else

if(y==

strlen

(b))}}

intmain()

KMP演算法的簡單理解

對於串的匹配,較為簡單的有bf演算法,但這種方法的可用性卻較差。因為在每次不匹配的時候,主串 m位 和子串 n位 都會回溯,有一種最壞的情況就是,主串每前進一位,都在n次匹配後失敗然後回溯,如 主串 aaaaaaaaaaaaaaaaaaaaab 子串 aab 這樣會導致bf演算法的時間複雜度大大提公...

KMP的簡單實現

kmp演算法是一種效率非常高的字串匹配演算法。給定兩個字串str和ptr,長度分別為n和m,判斷str是否在ptr中出現,如果出現則返回出現的位置。kmp演算法實現方式 我先舉個例子 str abcabcabe ptr abcabe 首先將abcabe轉化為next陣列000120 這是怎麼轉化的呢...

KMP演算法的簡單理解 筆記

這裡 kmp演算法是一種改進的 字串匹配 演算法,由d.e.knuth與v.r.pratt和j.h.morris同時發現,故稱kmp演算法 字串匹配 從字串t中尋找字串p出現的位置 p遠小於t 其中p稱為 模式 kmp演算法對模式串進行o m 的預處理後只需對文字t掃瞄一次即可找到匹配,所以時間複雜...