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

            假設S串為原始串, T串為目標串S串匹配到i位置, T串匹配到j位置.

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

            代碼如下 

                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;

                }

            對于普通的匹配算法來說回溯是無法避免的因為它必須對S串中的每個位置的i, 相對于T串中的j進行檢測是否匹配在每次檢測的失配情況下, i的位置才會發生變化.

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

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

            a

            c

            a

            c

            d

            ......

            a

            c

            a

            c

            b

            --->

            a

            c

            a

            c

            b

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

            3. next數組的含義

            這一部分解釋什么是next數組.

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

            假設當前的匹配情況如下 

            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], (上圖中藍色的部分為匹配的情況)那么我們可以當SiTj失配的情況下j = j-1, 讓匹配的過程繼續下去這時, i沒有發生改變, j的位置向左移動了一位也就是說, T相對于S向右移動了一位.

            PS : 下面是重點哦....

            也就是說SiTj時失配的情況下如果要達到i不變, T串相對于S串右移的目的可以更新j的值T串和S串繼續匹配.

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

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

            那么就可以讓SiTnext[j]繼續進行匹配的過程當然前提條件是next[j]<=j-1next[j]即為T[0, j-1]前部分和后部分相等的長度也就是說next值于T串本身相關而于S串無關. next數組即為KMP算法的精髓所在.


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

            導航

            隨筆分類

            隨筆檔案

            最新評論

            国产A级毛片久久久精品毛片| 国产成人精品久久| 99久久超碰中文字幕伊人| 99久久成人国产精品免费| www亚洲欲色成人久久精品| 久久e热在这里只有国产中文精品99| 日本欧美国产精品第一页久久| 伊人久久综合精品无码AV专区| 青青草国产成人久久91网| 久久笫一福利免费导航 | 欧美精品久久久久久久自慰| 国产成人精品白浆久久69| 欧美成a人片免费看久久| 国产午夜福利精品久久2021| 亚洲国产精品无码久久青草| www.久久热| 久久一日本道色综合久久| 久久亚洲高清综合| 久久亚洲高清观看| 久久夜色精品国产噜噜亚洲AV| 蜜桃麻豆www久久国产精品| 国产成人精品综合久久久| 国内精品伊人久久久久av一坑 | 日韩人妻无码精品久久免费一 | 久久午夜无码鲁丝片| 一级女性全黄久久生活片免费| 中文字幕亚洲综合久久2| 精品久久久久香蕉网| 国产精品成人久久久| 久久一区二区免费播放| 国产精品狼人久久久久影院| 成人久久综合网| 久久精品国产91久久麻豆自制| 久久人人爽人人爽人人AV东京热| 久久人人爽人人爽人人片av麻烦| 人妻无码αv中文字幕久久 | 亚洲综合伊人久久大杳蕉| 久久人人爽人人爽人人片av麻烦 | 亚洲欧洲日产国码无码久久99| 香蕉99久久国产综合精品宅男自| 久久强奷乱码老熟女网站|