溫習kmp演算法及修改

2022-04-30 21:45:16 字數 1051 閱讀 6813

1.串匹配的樸素方式;

已知兩個串,源 abcde  模式串 de ;

用3個指標, 開頭匹配,然後分別 增加,直到全匹配為止;否則 移動 de。**如下:  

int brutal_force(char *s,char*t){

int slen= strlen(s);

int tlen= strlen(t);

int i = 0;

while(i

2.kmp的方式

思想就是發生不匹配的時候,模式串盡量多移動

例如 ababd   匹配 

abababdc 的時候     到最後一位 模式串的第五位 不匹配 

應該直接移動 兩位,而且開頭的部分不用再比較,仍然從源串的第五位和next[5]繼續比較

ababd

abababdc

這個移動的位置,儲存 在next [m]的陣列中,這個值只與 模式串的固有屬性有關。

這裡就不細細討論原理,  這個值就是 : t[0],t[1]...t[m-1]的字首和字尾的最長匹配長度。

這個next陣列的求解**十分巧妙簡短,可以用迴圈不變式驗證。

**如下:

void index(char *t){

int len = strlen(t);

int j = -1;

int i = 0;

next[i]=j;

while(i

index部分還可以優化一下,即 如果    s[i]!=t[j] 時   就會更新 j=next[j]  但是要避免  t[j]==t[next[j]]的情況。 所以給next 陣列加這條約束  例如aaaaaaab 求next的時候就會做很多無用功 ,退化成樸素的方式了。

修改了某4行  :

int next_val[5];

void get_next_val(char *t){

int len = strlen(t);

int j =-1;

int i = 0;

next_val[i]=j;

while(i

KMP及KMP改進演算法

kmp 看毛片 演算法確實很難理解,上網搜了半天想了很久才大概想明白。kmp演算法精華在於next陣列 部分匹配值 即next陣列就是 字首 和 字尾 的最長的共有元素的長度。以 abcdabd 為例,a 的字首和字尾都為空集,共有元素的長度為0 ab 的字首為 a 字尾為 b 共有元素的長度為0 ...

BF演算法及KMP演算法

一.bf演算法 1.原理 暴力查詢 逐個匹配主串字元,然後模式串j值回溯到1重新匹配 2.實現 二.kmp演算法 1.原理 核心是避免不必要的回溯 問題是由模式串決定,不是目標串決定 只需要將j值模式串中j的位置回溯到next j 位,而免除了前面不需要的匹配,以此來換取時間 2.難點拆解 前字尾 ...

KMP演算法及應用

kmp演算法用來解決一系列字串單模式匹配問題,其以難理解,難記憶著稱。其next陣列的構造就如同ac自動機中的fail指標,就是如果匹配失敗,字串應從 開始繼續匹配。這裡的next陣列表示 next i 前i個字元的公共最長前字尾長度。覺得對於kmp演算法,這篇寫的不錯 現在來講一下應用。給定兩個字...