演算法學習 KMP匹配演算法

2021-08-09 02:20:19 字數 1683 閱讀 2381

最近資料結構上看到這個演算法,之前沒有進行過學習,現在來記錄一下

kmp演算法,主要用於字串的匹配

它比bf暴力演算法來說,減少時間複雜度,不用重複匹配太多

在我學習的過程中,我發現kmp演算法的精髓就是求解next陣列

我們先看看過程:

1。 對這個字串進行匹配,首先第乙個匹配,不對,移到下乙個

2。 就這樣,我們一直向下移到,直到遇到字串中有乙個字元與帶匹配字串中的第乙個配對

3。 往下匹配,直到遇到不同。在這裡,bf演算法採用的是回到頭的下乙個重新開始匹配

可是kmp不同,通過查表,得到該繼續下移的位置,這樣就提高了效率

可是怎麼得到這樣的一張表呢?

首先,我們先介紹一下字首,字尾

字首:除了最後乙個字元外,乙個字串的全部的頭部組合

字尾:除了第乙個字串外,乙個字串的全部的尾部組合

以abcdabd為例:

字串字首

字尾公有元素a無

無0aba

b0abca ab

bc b

0abcd

a ab abc

bcd cd d

0abcda

a ab abc abcd

bcda cda da a

1 aabcdab

a ab abc abcd abcda

bcdab cdab ab b

2 ab

abcdabd

a ab abc abcd abcda abcdab

bcdabd cdabd dabd abd bd d0

移動位數 = 匹配位數 —— 對應的部分匹配值

所以下一步移到為:

怎麼求解next陣列呢:

先付**:

int* getnext(char p,int n)

if(p[k] == p[i])

next[i] = k;

}return next;

}

這段**的核心就是while迴圈裡面的東西,怎麼理解呢,我是這樣理解的

我們知道,當我們匹配到當前字元的時候,前面的字元肯定是匹配了的,對於前乙個字元,肯定有它對應的匹配值

我們根據匹配值,可以的得到匹配的位數,也就是,到這一步, 能發生重複的字元

當while迴圈結束,我們得到在當前匹配步驟前,發生重複的字元中,如果它的後乙個跟當前相等,那麼k++

如果不等,就將之前的k賦值給它(個人感覺這個跟揹包問題有點相似)

我之前一直在思考,怎麼理解這個next陣列,和為什麼要求這樣

我這樣理解,因為我們需要匹配的字串中,是含有重複字元的,如果沒有重複字元,那麼我們只需要匹配了幾位,就移動幾位

可是現在有重複字元,我們就需要考慮重複字元的存在。也就是當匹配到當前位數的時候,我前面的最大匹配值,就是最大重複值,而最大重複值所對應的就是匹配字串中前幾位被重複的字元

void kmp(char data,int n,int

next,int

m,char p)else

if(t ==0)else

}else}}

KMP演算法學習

先貼上一點 等腦子清醒點再好好理解 求next陣列 public static int getnext string pattern else else return next public static int search string src,string pattern,int nextva...

KMP演算法學習

一 什麼是kmp演算法 knuth morris pratt 字串查詢演算法 常簡稱為 kmp演算法 是在乙個 主文字字串 s內查詢乙個 詞 w的出現,通過觀察發現,在不匹配 發生的時候這個詞自身包含足夠的資訊來確定下乙個匹配將在 開始 以此避免對以前匹配過的字元重新檢查。在原串中匹配模式串 二 k...

KMP演算法學習

1.kmp演算法簡介 2.樸素的匹配演算法 在介紹kmp演算法之前我們來看看那樸素的匹配演算法。定義 我們是在主串中搜尋模式串。如下圖當主串在e的位置與模式串發生失配時 e前面的都是匹配的 樸素的匹配演算法做的是,將模式串後移一位在去匹。我們可以思考這樣做是否有意義,因為模式串c前面是與主串匹配的,...