• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C小加

            厚德 博學(xué) 求真 至善 The bright moon and breeze
            posts - 145, comments - 195, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            從《嚴(yán)書(shū)》上看到了KMP算法,看了一遍沒(méi)懂,但覺(jué)得挺神奇的,就花費(fèi)了幾天時(shí)間深入的理解。

            算法的原理其實(shí)不難,難的就是那個(gè)巧妙的next數(shù)組,這個(gè)next數(shù)組很吸引我,我的大部分時(shí)間也都是花費(fèi)在這個(gè)數(shù)組上面的。這個(gè)next數(shù)組是KMP里面一個(gè)很關(guān)鍵的地方,對(duì)于在數(shù)據(jù)結(jié)構(gòu)書(shū)上看過(guò)一遍整個(gè)算法流程的人,能夠把next數(shù)組搞明白,整個(gè)KMP算法的整體思想就差不多理解了。然后在一些細(xì)節(jié)上面深入思考一下,就可以理解和領(lǐng)會(huì)改進(jìn)的KMP算法。

             

            一、KMP算法簡(jiǎn)單介紹

            KMP算法是字符串匹配算法的一種,相對(duì)于樸素的字符串匹配算法而言,可以大大避免重復(fù)遍歷的情況。此算法可以在On+m)的時(shí)間數(shù)量級(jí)上完成字符串匹配操作。

            二、神奇的next數(shù)組

            關(guān)于KMP算法的原理和實(shí)現(xiàn),書(shū)上或者百度一下都可以找到,我在這里就不羅嗦那么多了,直接切入主題(next數(shù)組)。

            我們?cè)O(shè)主串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個(gè)位置的時(shí)候失敗了,按照樸素的算法,i要回溯到第2個(gè)位置,j要回溯到第1個(gè)位置重新匹配。KMP的話(huà),主串中的i是不會(huì)回溯,模式串中的j回溯也不會(huì)回溯到第1個(gè)位置。注意這里是關(guān)鍵,i不用回溯就可以完成整個(gè)字符串的匹配。為什么i不需要回溯呢?我們先留下這個(gè)疑問(wèn)。

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

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

            5位置的后綴子串為:bcab , cab , ab , b

            我們觀察發(fā)現(xiàn)兩組里面都有一個(gè)ab,你能看出點(diǎn)什么東西么,好的,先不管這個(gè)。

            我們就按照樸素的算法來(lái)看,i回溯到第23位置都會(huì)在前5個(gè)字符中匹配失敗。

            樸素匹配:

                               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 

            當(dāng)回溯到第4個(gè)位置的時(shí)候,成功匹配的字符為ab然后再去判斷S串的第6個(gè)字符和P串的第3個(gè)位置。這個(gè)然后我們先不管,觀察S中和P匹配的ab,在第一趟匹配的時(shí)候S中的ab是和P中前5個(gè)字符的最后兩個(gè)匹配的,而這一次匹配則是和P中前兩個(gè)字符匹配的。能發(fā)現(xiàn)點(diǎn)什么東西么?

            不需要讓i回溯到之前的位置重新匹配,只需要找到在P串前5個(gè)字符中第一個(gè)位置的前綴子串和最后一個(gè)位置的后綴子串相等并且串長(zhǎng)最大的那一對(duì)子串,讓j指向前綴子串最后一個(gè)字符的下一個(gè)位置3,和i所指向的6進(jìn)行比較。往后遇見(jiàn)不匹配的時(shí)候采取和這個(gè)一樣的方法。

            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 

            這個(gè)時(shí)候就需要next數(shù)組的建立了,next[6]存儲(chǔ)的就是前5個(gè)字符組成的字符串中的第一個(gè)位置的前綴子串和最后一個(gè)位置的后綴子串相等并且串長(zhǎng)最大的那一對(duì)子串的最后一個(gè)字符的下一個(gè)位置,也就是3,也就是和P串中第3個(gè)位置匹配。

            寫(xiě)到這里,next數(shù)組應(yīng)該可以得出來(lái)了。

            具體代碼怎么得出來(lái)的,書(shū)上面都有。。那個(gè)應(yīng)該不難。

            對(duì)于next數(shù)組還有一個(gè)優(yōu)化,《嚴(yán)書(shū)》上講的很清晰。

            三、next數(shù)組在ACM中的應(yīng)用

            直接用KMP算法真的去匹配兩個(gè)字符串其實(shí)很少見(jiàn),除非字符串里的字符集范圍很小,或字符重復(fù)數(shù)量過(guò)多,用KMP可大減少時(shí)間,否則一般都是直接樸素匹配。
            kmp
            算法在ACM中并不大可能用來(lái)直接用,主要有用的是對(duì)它的理解和它的精華部分---- next數(shù)組,這個(gè)的一個(gè)用途就是確定重復(fù)子串,具體參見(jiàn) poj2406,poj1961,poj2752。

            next數(shù)組模板

             

            Feedback

            # re: KMP算法中關(guān)于next數(shù)組的探究  回復(fù)  更多評(píng)論   

            2011-09-21 12:38 by ooseven
            正則表達(dá)式算法現(xiàn)在已經(jīng)很成熟了,并且DFA方式的正則引擎同樣不需要回溯,而且通用性高很多,個(gè)人認(rèn)為沒(méi)有必要糾結(jié)與kmp,實(shí)際應(yīng)用中根本不需要,用dfa正則引擎好用得多,效率也不差。可能就是內(nèi)存占用稍微高了點(diǎn)。當(dāng)然,現(xiàn)在很多人研究kmp只是因?yàn)榭荚囆枰选?/div>

            # re: KMP算法中關(guān)于next數(shù)組的探究  回復(fù)  更多評(píng)論   

            2011-09-22 09:00 by C小加
            @ooseven
            我研究kmp是因?yàn)榕d趣,算法的用處雖然不大,但是思想?yún)s是很吸引人的。正則表達(dá)式算法我還沒(méi)接觸過(guò),不過(guò)看起來(lái)也蠻吸引人的。

            # re: KMP算法中關(guān)于next數(shù)組的探究  回復(fù)  更多評(píng)論   

            2011-09-22 11:35 by ooseven
            @C小加
            正則表達(dá)式算法看似簡(jiǎn)單,但是,動(dòng)手實(shí)踐之后你就會(huì)發(fā)現(xiàn),要徹底研究透根本就是個(gè)無(wú)底洞,復(fù)雜度主要與狀態(tài)數(shù)的優(yōu)化。因此,我的策略是能手工寫(xiě)出一個(gè)正則引擎就可以了,適可而止!

            # re: KMP算法中關(guān)于next數(shù)組的探究  回復(fù)  更多評(píng)論   

            2011-09-22 16:47 by C小加
            @ooseven
            這樣啊,我想研究一下,不知道怎么才能和大牛進(jìn)一步交流呢?如果有問(wèn)題的話(huà)想請(qǐng)教一下。

            # re: KMP算法中關(guān)于next數(shù)組的探究  回復(fù)  更多評(píng)論   

            2011-09-22 17:32 by ooseven
            @C小加
            哈,大牛可不敢當(dāng),正則表達(dá)式算法屬于編譯原理里的一門(mén)功課,而編譯原理在cppblog里唯一的大牛是 陳梓瀚(vczh),我的那個(gè)正則引擎在實(shí)現(xiàn)的時(shí)候還請(qǐng)教過(guò)他呢。

            # re: KMP算法中關(guān)于next數(shù)組的探究  回復(fù)  更多評(píng)論   

            2011-09-22 17:49 by C小加
            @ooseven
            恩恩。看到了。那兩篇文章。還有你的評(píng)論。嘻嘻。。那位大牛應(yīng)該正在寫(xiě)編譯器吧,而且感覺(jué)他對(duì)圖形圖像也很有研究,厲害呀。先拜讀那兩篇文章吧。

            # re: KMP算法中關(guān)于next數(shù)組的探究  回復(fù)  更多評(píng)論   

            2011-11-03 21:46 by 淺笑
            球球。。。

            # re: KMP算法中關(guān)于next數(shù)組的探究  回復(fù)  更多評(píng)論   

            2013-10-12 11:00 by 周炎婷
            問(wèn)一下,神馬叫第一個(gè)位置的前綴子串?
            久久久精品国产免大香伊| 久久久久99精品成人片欧美| 99久久久久| 亚洲精品国精品久久99热| 亚洲色大成网站WWW久久九九| 国产成年无码久久久久毛片| 久久久这里有精品中文字幕| 无码人妻久久久一区二区三区| 久久伊人精品青青草原高清| 久久久久人妻一区二区三区| 中文字幕久久欲求不满| 久久亚洲中文字幕精品有坂深雪 | 欧美大香线蕉线伊人久久| 99久久久久| 久久永久免费人妻精品下载| 亚洲国产成人精品久久久国产成人一区二区三区综 | 99久久无色码中文字幕人妻| 久久一本综合| 狠狠久久综合伊人不卡| 欧美激情精品久久久久| 久久久久人妻一区精品性色av| 99久久精品这里只有精品| 国内精品久久久久久99| 久久久无码精品亚洲日韩蜜臀浪潮| 国产三级观看久久| 亚洲国产精品久久| 久久久久久综合一区中文字幕| 亚洲中文久久精品无码| 久久99九九国产免费看小说| 久久久久亚洲AV成人网人人软件| 精品无码久久久久国产| 久久婷婷国产综合精品| 久久久无码精品亚洲日韩按摩 | 久久免费99精品国产自在现线| 国产99久久久国产精品~~牛| 国内精品久久久人妻中文字幕| 久久99国产综合精品女同| 国内精品久久久久影院日本 | 亚洲AV成人无码久久精品老人| 久久人做人爽一区二区三区| 亚洲熟妇无码另类久久久|