KMP next陣列理解

2021-10-03 23:56:52 字數 1339 閱讀 2424

3.15週末學長教了一下kmp,但是對next的構造尚存疑.在饒了一整天頭以後勉強弄懂了…記錄一下比較混亂就是了…

這裡的對稱指的的字元塊對稱而非軸對稱;

--------->當next[t]值為0時:

顯然就意味著從字串的開頭到這個t部分的話對稱性是0:即當繼續計算下一位的next[t+1] 的大小時只需比較第n+1位的字元與首字元是否相同即可

--------->當next[t]值不為0時:

這個時候就說明從字串的開頭到這個t部分的話存在對稱字元我們假設next[t]的值是a,那麼就說明前a個字元與後a個字元是相同的.我們計算next[t+1]時就只需要比較第a+1的字元與t+1的字元是否一致

當這兩個字元相同時,顯然,我們只需要令next[t+1]=next[t]+1即可

當這兩個字元不相同時

這裡先放乙個大佬碼的完整**

void

makenext

(const

char p,

int next)

next[q]

= k;

}}

相當於就是解釋一下這段語句的含義先看這幾個字母的定義

k:最大相同前字尾長度

p:輸入的要建next陣列的字串

q:要建立next陣列的下標

while(k > 0 && p[q] != p[k]):

這個很好理解,注意一下這個時候的k在沒有進行while迴圈時儲存的是在q-1個字元中的最大相同前字尾

意思就是如果沒有相同的前字尾了或者第k+1(因為next是從o開始建的)和第q個相同時我們就跳出

然後我們來分析一下:k = next[k-1];

這段**可以說是核心了

首先要進行這段語句的前提:

k > 0 && p[q] != p[k].首先要尚存相同的前字尾,如果已經沒有相同前字尾時,直接跳出給next[q]賦0就ok.並且p[q] != p[k].

緊接著看這個語句的意義:,我們仍然從第一次進入while迴圈分析:

這裡k本來是指q之前的字串最大前字尾長度,因為第q個字元和第k+1個字元不相同,我們再繼續找這最大前字尾長度包括的最大的前字尾長度,並且這樣迴圈的比較下去.知道發現能構成乙個新的最大前字尾長度或者是乾脆構不成.

KMP next陣列的求法

kmp 演算法的next陣列求法 void getnext char ptn,int next next j 更新自己的值。如果 1 j ptn i ptn j 這個條件成立,此時可以計算next i 1 的值為j 1。我看看這個過程 當i 6進入while迴圈之前,j next 6 當i 6進入w...

KMP next 陣列的思想

剛剛寫了點 我剛剛除錯了幾次 然後又在自行輸出 我先說說 啊,就是這個 next 陣列就為什麼可以求出前字尾最長 相同的數量?首先說說 前字尾,例如字串 aaaa,我們就直接用眼睛看的話,就是最長就是3,aaa a a aaa。這就是最長的前字尾,我們怎麼用 實現的呢?首先 前字尾 不能是一樣的 就...

KMP next陣列的花式使用

kmp演算法,是用來優化字串的模式匹配 源串s中是否存在模式串p 可以把暴力匹配的複雜度o n 降低到o m n 通過對模式串生成字首陣列 next陣列 來跳躍式的進行模式匹配,解決如hdu 1711 這樣的問題。我們一般使用的是把next 0 標記為負數 1 的修正版kmp。但是kmp演算法中最具...