「kmp演算法」,又稱看**演算法(我瞎說的),這個演算法的引入極大地優化了字串匹配的匹配的效率。是乙個十分著名的演算法。
它的原理就是通過給要匹配的字串加乙個next陣列,以這個陣列來作為它的回溯指導,減去不必要的回溯。那麼首先來看一下next陣列的規則是什麼,我簡單概括一下,就是判斷當前位置的字尾有無字首匹配,如果有,假設字尾字串長度為n,為多少就在當前位置填n+1;
舉個簡單的例子,字串t和它的next陣列;
t a b a a b a a b
next 011
2234
2
首先要明確字首必須從第一位開始它是固定的,不能從第二位開始。
我們分析第乙個,next[1]始終是0,這個不解釋,然後從第二位開始肯定也是1這是固定的,
然後我們從3位看起,這時候,字首的值為a,字尾是b,不匹配填1,
第4位,字首依舊是a,字尾變成a,有匹配值長度1,填1+1;
第5位,字尾雖然有aa,但是沒有字首匹配,故只能是字尾a和a匹配,填2;
第6位,字首可以ab了,字尾也是ab,匹配,長度2,填2+1;
第7位,字尾aba可以找到匹配的字首值,長度為3,填3+1;
這就是比較簡單的理解,如果你是應付考試,做題看到這裡就可以結束了,下面要說的是真正的難以理解的地方。我們來看一段**,可以跟著**單步除錯理解,
void
get_next
(string t,
int*next)
//把陣列位置給next[i];
else
next[i]
= next[j];}
else}}
intkmp
(string s,string t)
else}if
(j > t[0]
)else
}void
main()
KMP演算法 next陣列
通過上文完全可以對kmp演算法的原理有個清晰的了解,那麼下一步就是程式設計實現了,其中最重要的就是如何根據待匹配的模版字串求出對應每一位的最大相同前字尾的長度。我先給出我的 1 void makenext const char p,int next 214 next q k 15 16 現在我著重講...
KMP演算法 NEXT陣列
kmp和next陣列基本上是一起用的,有了next陣列,才有kmp演算法,講道理來說這兩個都是基於最大前字尾和,也就是說需要用到kmp的時候必須先把next陣列先求出來,next陣列就是由所匹配的word的每個子串的前字尾和最大匹配得到的,說實話next陣列的演算法給優化得已經很無解了,以至於至今我...
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 ...