kmp演算法next求解傻瓜式注釋

2021-10-02 16:44:35 字數 1270 閱讀 1807

在學習字串匹配的過程中接觸到了kmp演算法,在看過許多文章之後,發現許多文章對傻瓜作者不太友好,擔心遺忘,在此做出傻瓜式講解(不講解演算法原理,只記錄作者求學之路上的坎坷難點

注:next陣列求的是模式串的即目標子串,通俗點說是那個短的

kmp演算法的核心在於求next陣列的值,首先話不多說先貼**

void

getnext

(int next[

],string t)

else k = next[k]

;//點三

}}

首先我們看到**看點一處,設定next[0]為-1;這個地方我一開始並不理解,但在日常寫**時,為了各種方便也會將變數初始值設為-1,而在此next求解時,後續next值是根據前面next值的大小確定的,因此可以抽象地將next陣列看作乙個變數,只不過將變數每次變化的值都記錄下來,先暫且將看點一的疑惑擱置

到了點二處,在判斷二者字元相同後,先自增再賦值,這一處在理解整體**時相當重要,而這麼做的原因是在判斷該處字元相等後,可以直接決定如果下一字元匹配不成功返回最大相同字首的該相等字元下一位置的指標.這也可以理解為什麼初始值為-1,可以極大地方便後續求解.

點三則是最難點,乍一看實在是難以理解,這裡叫做k的回溯,首先要發現,這裡的k類似乙個計數器,記錄了從零開始有幾個字元與字首相同,知道這個之後,這裡就不難理解了,把k回溯到next[k]相當於是在從j=0開始最大相同字首的一輪返回next[j]在其內可能還有小迴圈例如abcabdabcabd;

而此next求值法存在缺陷,很多教程也都提出了,直接貼出改進**,

缺陷發生問題的原因在於t[j] == t[next[j]];

例如abab,當後乙個b匹配失敗時會回溯到第乙個b但這是完全沒有必要的;

void

getnext

(int next[

],string t)

else k = next[k];}

}

完整的使用kmp演算法

int

kmp(string s,string t)

else j=next[j]

;//使用了next陣列,開始發揮作用了!}if

(j>=t.

length()

)return

(i-t.

length()

);//匹配成功,返回子串的位置

else

return-1

;//匹配失敗

}

KMP演算法Next陣列求解

相信對於kmp演算法本身大家都理解,最難理解的就是這個next陣列的求解了。這是 p 為模式串,下標從 0 開始 void getnext string p,int next else j next j 根據我的理解,i 和 j 可以看成是兩個指標,用來跟蹤當前匹配的位置。可以發現 i 是會不斷的往...

KMP演算法next值的求解

求next函式值的過程本身是乙個遞迴過程,分析如下 next 7 2,存在t 6 t 1 k 1 t 7 t 2 t 6,7 t 1,2 next 8 3 t1 t3 已知 next 1 0 假設 next j k 又t j t k 則 next j 1 k 1 若 t j t k 則需要往前朔,檢...

KMP演算法 快速求解next陣列

在kmp演算法中,最關鍵的就是求解next陣列了。那麼如何快速求解next陣列呢?已知模式串 ab cdabdd a 其next陣列 00 0 0 12 0 0 1 那麼是如何求證出來的呢?首先字串從左至右遍歷。第乙個字元a的next陣列對應元素為0,第乙個字元a和第2個字元b比,不相等。b 0 表...