kmp演算法的理解著實花了不少時間,幸好網上前輩的部落格寫得都相當好,結合幾篇部落格仔細想想還是可以理解的,這裡僅做一下整理。
kmp演算法概念理解看這篇部落格就夠了字串匹配的kmp演算法by阮一峰
主要的邏輯那篇部落格都有講,求出next陣列,進行簡單的加減即可完成匹配。至於求解next陣列,則是kmp演算法的關鍵也是難點所在。
需參考以下兩篇部落格:
1、2、
第一篇的博主提出的求對稱性的思想非常利於理解,邏輯上證明了next陣列用於匹配字串的可行性。
第二篇博主要介紹了next陣列的求解演算法以及配圖,特此摘錄一下重點部分。
**實現
1
void makenext(const
char p,int next)
2 14 next[q] = k;
15 }
16}
對於其中的while迴圈:
1、已知前一步計算時最大相同的前字尾長度為k(k>0),即p[0]···p[k-1];
2、此時比較第k項p[k]與p[q],如圖1所示
3、如果p[k]等於p[q],那麼很簡單跳出while迴圈;
4、關鍵!關鍵有木有!關鍵如果不等呢???那麼我們應該利用已經得到的next[0]···next[k-1]來求p[0]···p[k-1]這個子串中最大相同前字尾,可能有同學要問了——為什麼要求p[0]···p[k-1]的最大相同前字尾呢???是啊!為什麼呢? 原因在於p[k]已經和p[q]失配了,而且p[q-k] ··· p[q-1]又與p[0] ···p[k-1]相同,看來p[0]···p[k-1]這麼長的子串是用不了了,那麼我要找個同樣也是p[0]打頭、p[k-1]結尾的子串即p[0]···pj-1,看看它的下一項p[j]是否能和p[q]匹配。如圖2所示
其中的圖2便是理解while迴圈中k = next[k-1];這一步的關鍵。
kmp演算法理解
宣告 下面兩段 摘自 結構之法 演算法之道 博主july大神的部落格。這裡,我只標記和注釋一下 算是自己的學習心得吧。優化過後的next 陣列求法 void getnextval char p,int next else 求next陣列,初始時 next 0 1,這個是固定的,k為當前最新求得的最長...
KMP演算法理解
kmp演算法是對普通模式匹配演算法的一種改進演算法,這種改進演算法是d.e.knuth與v.r.pratt和j.h.morris同時發現的,因此人們稱它為kmp演算法。kmp演算法最大的特徵就是引進了跳轉表 next表 下面我們來說說kmp演算法與普通演算法的區別。這裡我們先提乙個已知條件 目標串 ...
KMP演算法理解
在已知 母串 長度為n 中尋找 子串 長度為m 與在給定集合中尋找特定子集類似,但不同。暴力搜尋 類似滑動匹配 思路簡單,網上很多講解,不贅述。時間複雜度為o n m kmp模式匹配 充分利用 子串 特性,時間複雜度為o n m 發生匹配失敗時,子串滑動至 已匹配成功串 的 最長公共字尾 位置。在c...