關於KMP演算法的個人理解

2021-06-23 03:44:23 字數 1472 閱讀 3529

最近準備接下來的校招面試,一直沒學過資料結構的我,也不得不準備準備這方面的知識。對於字串匹配這個課題,現在有很多的方法,然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演算法的核心內容是乙個部分匹...