手算KMP匹配的Next值和Nextval值

2021-06-29 08:00:54 字數 1472 閱讀 5031

kmp 演算法我們有寫好的函式幫我們計算 next 陣列的值和 nextval 陣列的值,但是如果是考試,那就只能自己來手算這兩個陣列了,這裡分享一下我的計算方法吧。

計算字首 next[i] 的值:

我們令 next[0] = -1 。從 next[1] 開始,每求乙個字元的 next 值,就看它前面是否有乙個最長的"字串"和從第乙個字元開始的"字串"相等(需要注意的是,這2個"字串"不能是同乙個"字串")。如果乙個都沒有,這個字元的 next 值就是0;如果有,就看它有多長,這個字元的 next 值就是它的長度。

計算修正後的 nextval[i] 值:

我們令 nextval[0] = -1。從 nextval[1] 開始,如果某位(字元)與它 next 值指向的位(字元)相同,則該位的 nextval 值就是指向位的 nextval 值(nextval[i] = nextval[ next[i] ]);如果不同,則該位的 nextval 值就是它自己的 next 值(nextvalue[i] = next[i])。

舉個例子:

計算字首 next[i] 的值:

next[0] = -1;定值。

next[1] = 0;s[1]前面沒有重複子串。

next[2] = 0;s[2]前面沒有重複子串。

next[3] = 0;s[3]前面沒有重複子串。

next[4] = 1;s[4]前面有重複子串s[0] = 'a'和s[3] = 'a'。

next[5] = 2;s[5]前面有重複子串s[01] = 'ab'和s[34] = 'ab'。

next[6] = 3;s[6]前面有重複子串s[012] = 'abc'和s[345] = 'abc'。

next[7] = 4;s[7]前面有重複子串s[0123] = 'abca'和s[3456] = 'abca'。

計算修正後的 nextval[i] 值:

nextval[0] = -1;定值。

nextval[1] = 0;s[1] != s[0],nextval[1] = next[1] = 0。

nextval[2] = 0;s[2] != s[0],nextval[2] = next[2] = 0。

nextval[3] = -1;s[3] == s[0],nextval[3] = nextval[0] = -1。

nextval[4] = 0;s[4] == s[1],nextval[4] = nextval[1] = 0。

nextval[5] = 0;s[5] == s[2],nextval[5] = nextval[2] = 0。

nextval[6] = -1;s[6] == s[3],nextval[6] = nextval[3] = -1。

nextval[7] = 4;s[7] != s[4],nextval[7] = next[7] = 4。

手算KMP匹配的Next值和Nextval值

kmp 演算法我們有寫好的函式幫我們計算 next 陣列的值和 nextval 陣列的值,但是如果是考試,那就只能自己來手算這兩個陣列了,這裡分享一下我的計算方法吧。計算字首 next i 的值 我們令 next 0 1 從 next 1 開始,每求乙個字元的 next 值,就看它前面是否有乙個最長...

手算KMP匹配的Next值和Nextval值

kmp 演算法我們有寫好的函式幫我們計算 next 陣列的值和 nextval 陣列的值,但是如果是考試,那就只能自己來手算這兩個陣列了,這裡分享一下我的計算方法吧。計算字首 next i 的值 我們令 next 0 1 從 next 1 開始,每求乙個字元的 next 值,就看它前面是否有乙個最長...

KMP模式匹配演算法 next值求解

j 1 2 3 4 5 6 7 8 模式串 a b a a b c a c next j 0 1 1 2 2 3 1 2 各個位的解釋 1.前兩位必定為0和1。2.計算第三位的時候,看第二位b的next值,為1,則把b和1對應的a進行比較,不同,則第三位a的next的值為1,因為一直比到最前一位,都...