日曜日文字列照合アルゴリズム(C ++の実装)

要約:

日曜日のアルゴリズムは、ダニエルM.Sunday 1990マッチングアルゴリズムによって提案された文字列のモデルです。核となるアイデアは、次のとおりです。マッチングプロセスでは、パターン文字列は、左または右の比較比較するのに左または右を押してくださいする必要はありません、それが一致していない発見され、アルゴリズムはにできるだけ多くの文字をスキップすることができます改善されたマッチング効率が得られた一致の次のステップ、。

アイデア:

次の文字に一致するように失敗を懸念前後として日曜日KMPアルゴリズムとマッチングアルゴリズムは、文字列の最後のビットがメインマッチに参加することです。
図1に示すように、文字列がスキップ・モードで表示されない場合、すなわち、モードシフトビット数列+ = 1;
2、そうでない場合は、ビットの移動パターン文字列の長さ=番号-文字の右端位置(AT 0スタート)=文字列パターンの位置は、距離の最後に+ 1、右端に表示されます。

コード:

書式#include <iostreamの> 
の#include < 文字列 > 
の#include <cstdioを> 
する#include <sstream提供> 
する#include <ベクトル> 使用して、名前空間STD; int型のmain(){ 文字列のソース= " Hello Worldの、こんにちは中国、北京こんにちは" ;
     文字列の一部= 北京; int型のインデックス= 0 ; // 主にすべてのマッチの位置を記録するために使用されるint型の I = 0 ; // 位置開始するたびに新しいサイクルをint型 J、次の; //

 


    
    
    
    
    
    jが次の記録開始位置、ストリングの記録位置を横断するために使用される
    一方、(I < source.length())
    { 
        COUT << :開始、インデックス << I << チャー: <<ソース[I] << ENDL、 = iが+ (part.length)を、
        インデックス = I; 
        J = 0 ;
         IF(!パート[J] = 出典[インデックス])
        { 
            // 次の位置I再計算
            IFを(次の< source.length())
            { 
                int型のカット= 0 ;
                 のためINT Z = 0 ; Z <part.length(); Z ++ 
                { 
                    場合(ソース[次] == 部[Z])
                    { 
                        カット = Z。
                    } 
                } 
                もし(カット== 0 &&源[次] =部分[!0 ])
                {  ++ 
                } 
                
                {  - = 切断; 
                } 
            } 
            、I =次;
            続け; 
        } 
        
        { 
            一方(J < part.length())
            { 
                場合(一部[J]!= 源[インデックス])
                { 
                    // 重新计算私的下一个位置
                    する場合(次の< source.length())
                    { 
                        int型のカット= 0 ;
                        INT Z = 0 ; Z <part.length(); Z ++ 
                        { 
                            場合(ソース[次] == 部[Z]) 
                            {
                                カット Z。 = 
                            } 
                        } 
                        もし(カット== 0 &&源[次] =部分[!0 ])
                        {  ++ 
                        } 
                        
                        {  - = 切断; 
                        } 
                    } 
                    、I = 次回。
                    破ります; 
                } 
                インデックス ++  
                、J ++ ; 
            }
            もし(J == part.length())
            { 
                ブレーク
            } 
        } 
    } 
    もし(J == part.length())
    { 
        COUTは << " はい、指数が始まる" <<インデックスJ << ENDL。
    } 
    
    { 
        COUT << " 一致" << ENDL。
    } 
    
    
    戻り 0 
}

 

結果:

、開始インデックス:0CHAR :H 
開始インデックス:8CHAR :R 
始まり、指数:16チャー:O 
、開始インデックス:24チャー:Hは
開始インデックス:30チャー:B 
はい、開始インデックスがあります 30

 

分析:

初めてH開始、通過:

H ello世界、こんにちは中国、ハロー北京
 ^ 
Bの eijingの

H!= B

H ello W O RLD、ハロー中国、北京こんにちは
^次^ここで
Bの eijingの

次の位置から誰がないので#、すなわち第二ラウンドRを横断する、内部次のサブストリングを発生します
H ello W O R&LT LD、ハロー中国、北京ハロー
^^位置における横断Bの eijing
 

第二のパスは、R起動します:

こんにちはWO のR LD、HELのL 、O、中国、こんにちは北京
         ^ ^次
        のB eijingの

R!= B

第3パス、O起動します。

こんにちは、地獄O中国H ello北京
                 ^ ^次
                のB eijingの

 O!= B

第四にトラバーサル、hが起動します。

世界こんにちは、こんにちは中国、H ello B Eの ijing
                         ^ ^ のB eijingの

 Hは!= B 

次にEは、この時間は、Eに「北京」サブストリングされていますので、次回は、このセクションの「eijing」に移動する必要があります長さ

第五トラバーサル、B開始:

こんにちは、ハロー中国、ハローBの EIJING
                               ^ 
                              Bの EIJING

 Bの== bは
電子電子==
J J ==
私==私
のn == N
グラムグラム==

最後には、一致することができるようにします

 

アルゴリズムの時間計算量:O(NM)

アルゴリズム日曜日の面でより簡単かつ迅速KMPアルゴリズムよりも大きな割合をオフセットするので

 

おすすめ

転載: www.cnblogs.com/lyc94620/p/11420092.html