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

            隨筆 - 25, 文章 - 0, 評(píng)論 - 6, 引用 - 0
            數(shù)據(jù)加載中……

            KMP 匹配算法

            一:BF算法
                 如果讓你寫字符串的模式匹配,你可能會(huì)很快的寫出樸素的bf算法,至少問題是解決了,我想大家很清楚的知道它的時(shí)間復(fù)雜度為O(MN),原因很簡單,主串和模式串失配的時(shí)候,我們總是將模式串的第一位與主串的下一個(gè)字符進(jìn)行比較,所以復(fù)雜度高在主串每次失配的時(shí)候都要回溯,圖我就省略了。

             二:KMP算法
               剛才我們也說了,主串每次都要回溯,從而提高了時(shí)間復(fù)雜度,那么能不能在“主串”和“模式串”失配的情況下,主串不回溯呢?而是讓”模式串“向右滑動(dòng)一定的距離,對上號(hào)后繼續(xù)進(jìn)行下一輪的匹配,從而做到時(shí)間復(fù)雜度為O(M+N)呢?所以kmp算法就是用來處理這件事情的。


            代碼:
            #pragma once

            #include <iostream>

            //                --- 樸素匹配算法 --- 

            int NaiveMatch(const char * txt, const char * pat)  
            {
                int  nTxtLength = strlen(txt);
                int  nPatLength = strlen(pat);
                int  nTxt = 0;
                int  nPat = 0;
                int nCount = 0; // 計(jì)數(shù)

                while (nTxt <= nTxtLength - nPatLength && nPat < nPatLength)  
                {
                    ++nCount;

                    if (pat[nPat] == txt[nTxt+nPat])
                    {
                        ++nPat;
                    }
                    else
                    {
                        ++nTxt;
                        nPat = 0;
                    }
                }

                std::cout << "NaiveMatch, compare counts: " << nCount << std::endl;

                return  (nPat == nPatLength ? nTxt : -1);




            //                --- KMP 匹配算法 ---

            void GetNext(const char* pattern, int next[])
            {
                next[0] = 0;

                int j = 0;
                for (int i = 1; i < strlen(pattern); i++)
                {
                    while( j > 0 && pattern[j] != pattern[i] )
                    {
                        j = next[j-1];
                    }

                    if (pattern[j] == pattern[i])
                        j++;

                    next[i] = j;
                }
            }

            int KMPMatch(const char* src, const char* pattern, int next[])
            {
                int nSrc = 0;
                int nPattern = 0;
                int nCount = 0; // 計(jì)數(shù)

                while(nSrc < strlen(src) && nPattern < strlen(pattern))
                {
                    ++nCount;
                    if (0 == nPattern || src[nSrc] == pattern[nPattern])
                    {
                        ++nPattern;
                        ++nSrc;
                    }
                    else
                    {
                        nPattern = next[nPattern];
                    }
                }

                std::cout << "KMP, compare counts: " << nCount << std::endl;

                return (nPattern == strlen(pattern) ? nSrc - nPattern : -1);
            }



            #define PRINT_RESLUT(v) { if(-1 == (v)) std::cout << "No Find!"; else std::cout << "Position = " << (v); std::cout << std::endl << std::endl; }

            int main()
            {
                const char* Src        = "abc1aabc1aabc1aaababc1aababc1aabc1aaabc1aabc1aababc1aaabaabcbc1aa";
                const char* Pattern = "abaabc";

                int nPos = -1; // 保存匹配到的位置

                /// 樸素匹配算法
                nPos = NaiveMatch(Src, Pattern);
                PRINT_RESLUT(nPos);

                /// KMP匹配算法
                int next[6] = {0};
                GetNext(Pattern, next);
                nPos = KMPMatch(Src, Pattern, next);
                PRINT_RESLUT(nPos);
               
               system("pause");
               return 0;     
            }

            運(yùn)行結(jié)果:


            疑惑:為什么KMP的效率會(huì)更低?

            posted on 2013-03-20 19:06 chenjt3533 閱讀(305) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++

            久久无码人妻一区二区三区| 91久久精品无码一区二区毛片| 欧美激情精品久久久久久| 中文字幕久久亚洲一区| 热99RE久久精品这里都是精品免费| 色综合久久久久久久久五月| 国产免费久久精品丫丫| 亚洲国产精品无码久久98| 国产午夜精品久久久久九九电影| 久久人妻无码中文字幕| 国产精品久久久久久久久久免费| 久久综合狠狠综合久久综合88| 国产精品狼人久久久久影院| 激情伊人五月天久久综合| 国产精品久久久久久久app| 国产国产成人久久精品| 国产精品久久成人影院| 亚洲香蕉网久久综合影视| 热RE99久久精品国产66热| 亚洲伊人久久大香线蕉苏妲己| 亚洲va久久久噜噜噜久久狠狠 | 精品综合久久久久久88小说 | 秋霞久久国产精品电影院| 欧美熟妇另类久久久久久不卡| 欧美与黑人午夜性猛交久久久| 久久综合九色综合久99| 国产精品99久久久久久人| 久久综合狠狠综合久久| 久久天堂AV综合合色蜜桃网 | 中文字幕精品久久| 香蕉久久AⅤ一区二区三区| 久久五月精品中文字幕| 国产精品成人久久久久三级午夜电影 | 久久国产精品国产自线拍免费| 亚洲国产精品无码成人片久久| 奇米综合四色77777久久| 亚洲av日韩精品久久久久久a| 久久99精品国产麻豆宅宅| 男女久久久国产一区二区三区| 九九精品99久久久香蕉| 77777亚洲午夜久久多喷|