KMP算法中關於next數組的探究

轉自:http://www.cnblogs.com/cxiaojia/archive/2011/09/16/kmp.html

看了一天的KMP,其中最蛋疼的莫過於next數組的意思了,看了好多人的資料,包括matrix67大牛的博客,看了半天也沒搞懂爲什麼要開個next數組,湊巧搜到這篇文章,講得還比較清楚。


原文如下:


從《嚴書》上看到了KMP算法,看了一遍沒懂,但覺得挺神奇的,就花費了幾天時間深入的理解。

算法的原理其實不難,難的就是那個巧妙的next數組,這個next數組很吸引我,我的大部分時間也都是花費在這個數組上面的。這個next數組是KMP裏面一個很關鍵的地方,對於在數據結構書上看過一遍整個算法流程的人,能夠把next數組搞明白,整個KMP算法的整體思想就差不多理解了。然後在一些細節上面深入思考一下,就可以理解和領會改進的KMP算法。

 

一、KMP算法簡單介紹

KMP算法是字符串匹配算法的一種,相對於樸素的字符串匹配算法而言,可以大大避免重複遍歷的情況。此算法可以在O(n+m)的時間數量級上完成字符串匹配操作。

二、神奇的next數組

關於KMP算法的原理和實現,書上或者百度一下都可以找到,我在這裏就不羅嗦那麼多了,直接切入主題(next數組)。

我們設主串S=abcabcabca,模式串p=abcabx。

KMP第一趟匹配:

                         i=6                    

S    :   a  b  c  a  b  c  a   b  c  a

位置 :  1  2  3  4  5  6  7  8  9  10

P    :   a  b   c  a  b  x

位置 :  1  2  3  4  5  6

                           j=6                      

第一次匹配到第6個位置的時候失敗了,按照樸素的算法,i要回溯到第2個位置,j要回溯到第1個位置重新匹配。KMP的話,主串中的i是不會回溯,模式串中的j回溯也不會回溯到第1個位置。注意這裏是關鍵,i不用回溯就可以完成整個字符串的匹配。爲什麼i不需要回溯呢?我們先留下這個疑問。

我們把匹配成功的前5個字符研究一下。

1位置的前綴子串爲:a , ab , abc , abca

5位置的後綴子串爲:bcab , cab , ab , b

我們觀察發現兩組裏面都有一個ab,你能看出點什麼東西麼,好的,先不管這個。

我們就按照樸素的算法來看,i回溯到第2第3位置都會在前5個字符中匹配失敗。

樸素匹配:

                   i=4                    

S    :  a  b  c  a  b  c  a   b  c  a

位置 : 1  2  3  4  5  6  7  8  9  10

P    :             a  b  c  a  b  x

位置 :            1  2  3  4  5  6

                   j=1 

當回溯到第4個位置的時候,成功匹配的字符爲ab,然後再去判斷S串的第6個字符和P串的第3個位置。這個然後我們先不管,觀察S中和P匹配的ab,在第一趟匹配的時候S中的ab是和P中前5個字符的最後兩個匹配的,而這一次匹配則是和P中前兩個字符匹配的。能發現點什麼東西麼?

不需要讓i回溯到之前的位置重新匹配,只需要找到在P串前5個字符中第一個位置的前綴子串和最後一個位置的後綴子串相等並且串長最大的那一對子串,讓j指向前綴子串最後一個字符的下一個位置3,和i所指向的6進行比較。往後遇見不匹配的時候採取和這個一樣的方法。

KMP第二趟匹配:

                           i=6                    

S    :   a  b  c  a  b  c  a   b  c  a

位置 :  1  2  3  4  5  6  7  8  9  10

P    :              a  b  c  a  b  x

位置 :             1  2  3  4  5  6

                           j=3 

這個時候就需要next數組的建立了,next[6]存儲的就是前5個字符組成的字符串中的第一個位置的前綴子串和最後一個位置的後綴子串相等並且串長最大的那一對子串的最後一個字符的下一個位置,也就是3,也就是和P串中第3個位置匹配。

寫到這裏,next數組應該可以得出來了。

具體代碼怎麼得出來的,書上面都有。。那個應該不難。

對於next數組還有一個優化,《嚴書》上講的很清晰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章