最近準備接下來的校招面試,一直沒學過資料結構的我,也不得不準備準備這方面的知識。對於字串匹配這個課題,現在有很多的方法,然kmp確實其中經典的一種方法,這兩天找了很多的相關資料,卻發現理解很簡單,而實現卻有點小困難,為了永久解決這個問題,苦心鑽研了下,現把我的理解記錄如下,供有相同疑惑的童鞋一起學習,**。
問題:有乙個目標文字串t,和乙個模式串p,現在要查詢p在t中的位置,怎麼查詢呢?
首先我們還是看下最基本的暴力求解(相信這個方法大家都了解了):
假設現在目標文字串t匹配到 i 位置,模式串p匹配到 j 位置;
1.如果當前字元匹配成功(即t[i]== p[j]),則i++,j++,繼續匹配下乙個字元;
2.如果當前字元不匹配(即t[i]!=p[j] ),則令i=i- (j - 1)
,j = 0
。即每次失配時,模式串都要從第一位開始重新匹配,i需要回溯,j被置為0;
c++**如下:
//暴力求解字串匹配b-f演算法
//sztarget表示目標字串,szpattern表示模式字串(即最終需要查詢到的字串)
void match(const string& sztarget,const string& szpattern)
}
或者如下:
//計算next陣列
//next[i]表示模式串的第i位與目標串不匹配時(前面i-1位都匹配),下一步i的值
void getnext(const string& szpattern,vector& vinext)
。同理可得模式串「ababcabaa」的next=;
void kmpmatcher(const string& sztarget,const string& szpattern,vector& vinext)
時,若第j=2位』a』與目標文字串第i位不匹配時,下一步將會用第j=0位』a』與目標文字串第i位比較,但此時明顯是匹配的,那我們是不是也可以更改next的值:令next[2]= next[0]=-1 表示呢?顯然是可以的,
按照此更改後我們可得新的next=.
那我們怎樣更改程式呢?如下://計算next陣列
//next[i]表示模式串的第i位與目標串不匹配時(前面i-1位都匹配),下一步i的值
void getnext(const string& szpattern,vector& vinext)
{ int ipatternlen = szpattern.size();
vinext.resize(ipatternlen);
vinext[0] = -1;
int iindex = 0;
int itemp = -1;
while(iindex自此,kmp演算法得以理解,不知各位網友可理解了?如有不理解,歡迎相互交流交流。
1.《資料結構》第二版,嚴蔚敏,吳偉明著;
2.《演算法導論》第三版中文版第32章;
3.4.
KMP 演算法(個人理解)
相信大家看了 matrix67 的講解,一定已經知道了 kmp 演算法是怎麼回事,怎麼操作的,為什麼時間複雜度不高 這裡,我主要是分享我對 kmp 的理解 kmp 的精髓是什麼?這個東西,各自有個字的理解,很多人都覺得是避免了重複匹配,而我的理解是預處理 為什麼是預處理?你看看 kmp 的執行過程 ...
KMP演算法的個人理解
自學了一段時間,剛剛準備轉行做軟體開發,面試過程中被指出計算機基礎知識薄弱。因為是非科班出生,確實有些計算機方面的基礎沒有學過,也開始惡補這些方面的東西。最近在學習資料結構與演算法過程中,學到kmp演算法,甚是難解。看了阮一峰的網路日誌後才慢慢理解,但也發現其中的瑕疵,在此也順帶指出,至於對或不對,...
KMP演算法的個人理解
kmp演算法是一種改進的字串匹配演算法,由d.e.knuth,j.h.morris和v.r.pratt同時發現,因此人們稱它為克努特 莫里斯 普拉特操作 簡稱kmp演算法 kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。kmp演算法的核心內容是乙個部分匹...