關於KMP演算法的next陣列自己的理解

2021-10-03 05:49:55 字數 763 閱讀 1298

最近重溫了kmp演算法,順便記錄一下對kmp演算法的理解,比較難懂的應該算是next資料的使用了,先說說自己的理解

首先要理解next陣列的含義,假設有字串

假設有字串s和p,要在s中找到p,當比較p[i]和s[j]不相等時,如果是樸素演算法,p回溯到0, s回溯到開始匹配的下乙個位置(則i需要回溯到0(i=0)),從p[0]開始繼續和s[j]繼續比較,但在kmp演算法裡,p不需要回溯到0,回溯到next[i] = n(n

def kmp_next(patterm):

next_arr = [0]

# prefix_index處在字串字首,

prefix_index = 0

i = 1

while i < len(patterm):

if patterm[i] == patterm[prefix_index]:

prefix_index += 1

i +=1

else:

# 如果不相等,prefix_index回溯到它的上乙個位置

if prefix_index >= 1:

prefix_index = next_arr[prefix_index - 1]

continue

# 如果prefix_index為0說明字首和字尾沒有相同的串

if prefix_index == 0:

i+=1

continue

return next_arr

關於KMP演算法的next陣列

kmp的next陣列求法是很不容易搞清楚的一部分,也是最重要的一部分。我這篇文章就以我自己的感悟來慢慢推導一下吧!保證你看完過後是知其然,也知其所以然。如果你還不知道kmp是什麼,請先閱讀上面的鏈結,先搞懂kmp是要幹什麼。下面我們就來說說kmp的next陣列求法。kmp的next陣列簡單來說,假設...

關於KMP的next陣列

明明寫的和課本一樣,但是在pta就是不正確,參考了別人的答案,發現有乙個地方不一樣記錄一下!include include include int next1 1000 next1 j k,表示當t i p j 時,j指標的下乙個位置。求字串在主串中第一次出現的位置 void get next1 c...

KMP演算法 next陣列

通過上文完全可以對kmp演算法的原理有個清晰的了解,那麼下一步就是程式設計實現了,其中最重要的就是如何根據待匹配的模版字串求出對應每一位的最大相同前字尾的長度。我先給出我的 1 void makenext const char p,int next 214 next q k 15 16 現在我著重講...