KMP演算法理解

2021-08-21 20:33:42 字數 872 閱讀 8119

kmp演算法是一種改進的字串匹配的演算法,在之前我們看到在字串a中找出字串b的位置這樣的題時,第一反應就是用兩個for迴圈來進行查詢,這樣的效率比較低,如果兩個字串的長度非常大的話,就會需要花費很長的時間來進行查詢。kmp演算法就是將從原來普通匹配的o(n*m)時間複雜度,縮短為o(n+m)的時間複雜度,大大的提高了效率。

kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是查詢子串的next陣列,通過next陣列中的值來實現kmp演算法,減少一些不必要的比較。next中儲存的是當前字元與子串字首的最大匹配,也就是這個字元和之前的字元與子串的字首相同,next陣列的儲存有兩種,一種是0型的,一種是-1型的。我明白了那種0型的,-1型的知道它是0型類的優化,但是看了很多資料還是沒有能夠理解,問了學長知道了它的優化之處就在於當next陣列中當前的值是-1是可以不用再進行判斷直接跳過,判斷下乙個,而0型的next陣列只是當它匹配不成功時,返回到下標為它前乙個next陣列值的字元進行判斷。

在查詢0型next陣列是我比較習慣從標0的時候定義為0,next陣列的的查詢就是自身字元的比較,後面下標為i的字元與前面下標為j的字元進行比較,當相等時next[i]=j+1;說明下標為i的字元與子串字首第j+1個字元相同,i與j都向後走,繼續查詢;當j等於0時不相等的話下標i繼續向後走與下乙個比較,當j大於0不相等時,j更新為next[j-1]繼續查詢。直到為子串的所有字元都的next值都賦值上。

kmp演算法在比較兩個字串時**和儲存next陣列的**是差不多的,都是判斷相等,j是否為0時的不相等。關於kmp演算法的應用本次的練習有求子串在主串中的位置,主串中含有幾個子串,主串進行迴圈移位是否含有子串及一些直接運用next陣列找模式串的字首字尾迴圈,及不同長度下的模式串是否迴圈求長度和迴圈數;這些都是對kmp演算法模板的簡單變形。

KMP演算法理解

kmp演算法的理解著實花了不少時間,幸好網上前輩的部落格寫得都相當好,結合幾篇部落格仔細想想還是可以理解的,這裡僅做一下整理。kmp演算法概念理解看這篇部落格就夠了字串匹配的kmp演算法by阮一峰 主要的邏輯那篇部落格都有講,求出next陣列,進行簡單的加減即可完成匹配。至於求解next陣列,則是k...

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演算法與普通演算法的區別。這裡我們先提乙個已知條件 目標串 ...