• <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>

            KMP(1)--KMP算法解析

            KMP(1)--KMP算法解析

            1. 普通字符串匹配BF算法

            假設(shè)S串為原始串, T串為目標(biāo)串S串匹配到i位置, T串匹配到j位置.

            BF算法中如果當(dāng)前字符匹配成功, (S[i+j] == T[j]) j++, 繼續(xù)匹配下一個(gè)字符如果失配, (S[i+j] != T[j]), 需要i++, j = 0; 也就是目標(biāo)串相對(duì)于原始串向右移動(dòng)了一位.

            代碼如下 

                int index(char* s, char* t){

                    int slen = strlen(s);

                    int tlen = strlen(t);

                    if (slen < tlen || slen <= 0 || tlen <= 0){

                        return -1;

                    }

                    int i = 0;  ///< record position in s string

                    int j = 0;  ///< record position in t string

                    while (i <= slen && j <= tlen){

                        if (s[i + j] == t[j]){

                            ++j;

                        }

                        else{

                            j = 0;

                            ++i;

                        }

                    }

                    if (j == tlen){

                        return i;

                    }

                    return -1;

                }

            對(duì)于普通的匹配算法來(lái)說(shuō)回溯是無(wú)法避免的因?yàn)樗仨殞?duì)S串中的每個(gè)位置的i, 相對(duì)于T串中的j進(jìn)行檢測(cè)是否匹配在每次檢測(cè)的失配情況下, i的位置才會(huì)發(fā)生變化.

            2. 使用KMP算法如何避免回溯

            先看看下面的例子 第一行是S第二行是T

            a

            c

            a

            c

            d

            ......

            a

            c

            a

            c

            b

            --->

            a

            c

            a

            c

            b

            當(dāng)S串和T串在匹配到第五個(gè)字符時(shí)失配那么如果這時(shí)T串能夠右移2那么就可以繼續(xù)下面的匹配如第三行所示同樣的道理如果當(dāng)T串當(dāng)前的匹配位置j失配了那么j可以向右移動(dòng)的值即為jnext.

            3. next數(shù)組的含義

            這一部分解釋什么是next數(shù)組.

            另原始串S[i], 0<=i<=n; 模式串T[i], 0<=i<=m

            假設(shè)當(dāng)前的匹配情況如下 

            S0

            S1

            S2

            ...

            Si-j

            Si-j+1

            Si-j+2

            ...

            Si-2

            Si-1

            Si

            Si+1

            Si+2

            ...

            Sn

            T0

            T1

            T2

            ...

            Tj-2

            Tj-1

            Tj

            ...

            T0

            T1

            ...

            Tj-3

            Tj-2

            Tj-1

            ...

            如果S[i-j, i-1] == T[0, j-1]并且T[1, j-1] == T[0, j-2], (上圖中藍(lán)色的部分為匹配的情況)那么我們可以當(dāng)SiTj失配的情況下j = j-1, 讓匹配的過(guò)程繼續(xù)下去這時(shí), i沒(méi)有發(fā)生改變, j的位置向左移動(dòng)了一位也就是說(shuō), T相對(duì)于S向右移動(dòng)了一位.

            PS : 下面是重點(diǎn)哦....

            也就是說(shuō)SiTj時(shí)失配的情況下如果要達(dá)到i不變, T串相對(duì)于S串右移的目的可以更新j的值T串和S串繼續(xù)匹配.

            假設(shè)新的j值用next[j]表示如果能夠保證 :

            T[j-1-next[j], j-1] == T[0, next[j]]

            那么就可以讓SiTnext[j]繼續(xù)進(jìn)行匹配的過(guò)程當(dāng)然前提條件是next[j]<=j-1next[j]即為T[0, j-1]前部分和后部分相等的長(zhǎng)度也就是說(shuō)next值于T串本身相關(guān)而于S串無(wú)關(guān). next數(shù)組即為KMP算法的精髓所在.


            posted on 2012-01-07 14:35 Apollo Fang 閱讀(273) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Algorithm


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            導(dǎo)航

            隨筆分類

            隨筆檔案

            最新評(píng)論

            久久久久国产精品麻豆AR影院| 久久国内免费视频| 久久精品国产99国产精品澳门| 久久久久免费精品国产| 欧美激情精品久久久久久久九九九| 人妻无码精品久久亚瑟影视| 欧美一区二区三区久久综合| 久久电影网一区| 久久综合视频网| 色综合久久88色综合天天| 国产69精品久久久久APP下载| 无码国内精品久久人妻蜜桃| 国内精品久久久久久麻豆| 欧洲成人午夜精品无码区久久| 久久精品这里只有精99品| 精品熟女少妇av免费久久| 手机看片久久高清国产日韩| 久久不射电影网| 久久人人爽人人爽人人片AV不| 久久久久综合中文字幕| 国产精品一区二区久久不卡 | 综合久久给合久久狠狠狠97色| 2022年国产精品久久久久| 国产成人精品久久| 色综合久久天天综线观看| 久久中文字幕一区二区| 国产亚洲欧美成人久久片| 色8久久人人97超碰香蕉987| 一级做a爰片久久毛片免费陪| 国产精品一区二区久久精品无码| 国产精品久久久久久久久鸭| 久久精品国产99久久久| 亚洲AV无码1区2区久久| 成人久久免费网站| 久久免费看黄a级毛片| 18禁黄久久久AAA片| 一本色道久久综合狠狠躁| 精产国品久久一二三产区区别| 婷婷国产天堂久久综合五月| 国产精品成人久久久| 亚洲va久久久噜噜噜久久天堂|