最近資料結構上看到這個演算法,之前沒有進行過學習,現在來記錄一下
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前面是與主串匹配的,...