1. 程式人生 > >【資料結構】KMP手工計算next陣列和nextval陣列

【資料結構】KMP手工計算next陣列和nextval陣列

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。