字串搜尋

thesby發表於2016-06-01

字串搜尋是一種非常常見的應用,暴力搜尋是直接去匹配各個字元,但是這種方法對於重複度較高的字串來說,有點浪費計算了。KMP演算法利用子串本身的特性,試圖建立一種狀態機,指出匹配到當前字串的狀態如何。http://blog.csdn.net/thesby/article/details/51243270

Next陣列怎麼求?

next陣列的求解方法是:第一位的next值為0,第二位的next值為1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續尋找next值對應的內容來與前一位進行比較,直到找到某個位上內容的next值對應的內容與前一位相等為止,則這個位對應的值加上1即為需求的next值;如果找到第一位都沒有找到與前一位相等的內容,那麼需求的位上的next值即為1。

這樣的描述好像不太容易理解,我們可以直接看一個例子。
1 2 3 4 5 6 7 8
a b a a b c a c
所以,第一步的next
1 2 3 4 5 6 7 8
a b a a b c a c
0 1
第二步,看第三位的前一個是b,它與自己next位置1的字元a比較,不相等,所以他就是1了。
接下來,
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1
第三步,看第三個字元a,可見它與自己next對應的是相等的,那就是在此基礎上+1,
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1 2
第四步,第四個字元的a和它對應的next位置2的b不等,所以它就是再和2位置b的next比較,此時相等了,那麼就是2了,所以
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1 2 2
第五步,第五個字元b和自己對應next字元相等,所以+1,
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1 2 2 3
第六步,第六個字元c沒有與前面的重複,所以第七個位置的next就是1,
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1 2 2 3 1
最後一個,看第七個是a,它對應next位置字元剛好和它相等,所以第八個next就是2了,
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1 2 2 3 1 2

參考了http://blog.csdn.net/quitepig/article/details/7933977

相關文章