KMP演算法求next陣列的一些理解

2021-08-05 19:08:59 字數 859 閱讀 7060

看了一天的kmp演算法,終於對其有所理解,下面是對該演算法的理解,希望對初學該演算法的同學有所幫助。

net函式的求解

先看演算法:

public

static

int getnext(int p)

else

}return next;

}

對於這個演算法的難點在於,如果對於下乙個next值(其中 p[i]!=p[j]的情況)該怎樣求解

即我們已知next[i] = k,同時p[k]!=p[i],求next[i+1]

由此我們可知:p[i1] =p[i-k+i1] i1 = 0,,,k-1

既然p[k]!=p[i]

那麼,next[i]的最大值只可能是next +1,為什麼,讓我們來證一下。

證明:

既然p[k]!=p[i],那麼,要想找到對稱串,與p[i]相等的也只能在索引k前面找了。(不然,next(i)就大於k了)

我們設p[i2] = p[i]那麼此時顯然就是我們要找的對稱串,則next(i+1)=i2+1

則,由此推論:p[i1]=p[i-i2+i1] (i1=0,1,…i2-1)

又因為p[i1] =p[i-k+i1] i1 = 0,,,k-1(上面的條件),

可以知道p[i-i2+i1]=p[i-k+i1](i1=0,1,…,i2-1)

進而可知p[i1] = p[k-i2+i1] (i1=0,1,…,i2-1)

則的對稱串

即next(k) = i2則next(i+1) = next(k)+1

故得證

因此,如果不是相應的next(k)+1,那只能繼續從字串的字串中找了。

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

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

KMP演算法中怎麼求next陣列

例如 1 2 3 4 5 6 7 8 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 2 next陣列的求解方法是 第一位的next值為0,第二位的next值為1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等...

KMP模式匹配演算法求next陣列

j12 3456 78值a baab cacnext01 1223 12j是字串中的位置 從1開始計算 值是字串對應j位置的字母,next是next陣列中的值。下面是計算方法 1 首先next 1 0,next 2 1 這兩個是固定不變的 2 除了j 1和j 2時,求解next j 首先我們要獲取到...