KMP演算法 next陣列

2021-07-04 14:42:17 字數 827 閱讀 6486

通過上文完全可以對kmp演算法的原理有個清晰的了解,那麼下一步就是程式設計實現了,其中最重要的就是如何根據待匹配的模版字串求出對應每一位的最大相同前字尾的長度。我先給出我的**:

1

void makenext(const

char p,int

next)

214 next[q] =k;15}

16 }

現在我著重講解一下while迴圈所做的工作:

已知前一步計算時最大相同的前字尾長度為k(k>0),即p[0]···p[k-1];

此時比較第k項p[k]與p[q],如圖1所示

如果p[k]等於p[q],那麼很簡單跳出while迴圈;

關鍵!關鍵有木有!關鍵如果不等呢???

那麼我們應該利用已經得到的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]···p[j-1](j==next[k-1]),看看它的下一項p[j]是否能和p[q]匹配。如圖2所示

KMP演算法 NEXT陣列

kmp和next陣列基本上是一起用的,有了next陣列,才有kmp演算法,講道理來說這兩個都是基於最大前字尾和,也就是說需要用到kmp的時候必須先把next陣列先求出來,next陣列就是由所匹配的word的每個子串的前字尾和最大匹配得到的,說實話next陣列的演算法給優化得已經很無解了,以至於至今我...

kmp演算法next例題 KMP演算法next陣列求解

kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...

KMP演算法的next陣列

本文參考 google 資料結構 c語言 include include author silence time 2012 5 19 description kmp演算法的next using namespace std void next char t,int l,int next else 1 ...