關於KMP演算法 next陣列生成的一些思考

2021-10-04 21:22:00 字數 917 閱讀 4862

kmp演算法相對於bf演算法,是控制了主串的回溯,只有子串回溯,並且子串每次會回溯到想要的位置,而不是回溯到子串的第乙個字元處。關於next陣列的生成,不解。資料結構書裡面是這樣寫的:

void get_next(string t, int *next){

int i,j;

i = 1;

j = 0;

next[1] = 0;

while (i < t[0]) //這裡t存放的是串長度

if (j == 0 || t[i] == t[j]){  //t[i]總是表示字尾的單個字元 t[j]表示字首的單個字元

++i;

++j;

next[i] = j;

else{

j = next[j];  //若字元不相同,則j值回溯

首先要理解,next陣列元素值得意義是什麼?我是這麼理解的,next[i]的意義就是,當前字元之前的最大重複字串(字首)的下乙個字元的位置,比如串「ababc」,我們下標從1開始,next[5] = 3,當前字元為c時,他的前串最大重複的字元為ab,那麼next[5] = 3,位於3位置的字元是ab之後的a。其目的就是j回溯的時候,從ab 之後的a開始比較,因為ab和字尾是重複的,既然之前比較的還是比較到了字元c,也就是說字首ab也不用比較了,肯定相等。

那麼對於計算next元素值的時候,上面的t[i],t[j] 我理解為是t[i]總是字尾字串的最後乙個字元,而t[j]總是字首字串的最後乙個字元,為啥是最後乙個呢,迭代呀,後面的利用前面的重複關係,前面我們說了,next元素值是當前字元之前的最大重複字串(字首)的下乙個字元的位置,也就是t[j]的下乙個位置,即++j。也就是上面**的if條件。那麼如果if條件不滿足,前面我們也說了,字元是迭代的,後面的繼承前已經確定的next元素值,或者說重複關係,如果當前if條件不滿足,則j要回溯到上一次重複串的下乙個位置,開始重新匹配,迭代。

關於KMP演算法的next陣列

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

KMP演算法next陣列生成中k next k 解釋

本文適用於讀者對kmp演算法有一定的了解 void initnextarray string p 上述 是kmp演算法中next陣列的建立過程,最難理解的過程就是k next k 這一行 今天給大家來解釋一下這句 背後隱藏的遞迴思想。首先給大家捋一捋各個引數的意義 j是模式串的當前角標 k是在模式串...

KMP演算法 next陣列

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