看了一天的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 首先我們要獲取到...