KMPパターンマッチングアルゴリズム

プロフィールには
、いくつかのサイエントロジーは、新しいアルゴリズムの研究では、3人の高齢者はDEKnuth、JHMorrisとVRPrattあるので、このアルゴリズムはクヌースと呼ばれ、あまりにも不平を研削暴力一致する文字列を感じている-モリス-プラットこのアルゴリズムは、KMPアルゴリズムと呼ばれる
コアアイデア
メイン文字列のは、バックトラックなしで1ずつインクリメントされ、文字がストリングの適切な位置と一致していない時間を記録するために使用される次のサブストリング配列の導入は、背面に行けば
、アルゴリズムのプロセス
、実際にKMPアルゴリズムは、マッチングアルゴリズムからの暴力の基礎となっています修正されたアルゴリズムは、我々は、KMPアルゴリズム照合処理手順の理解暴力で開始
例:
メインストリングS =「abcdefgab」
パターン文字列T =「abcdex」
暴力アルゴリズムマッチングプロセス
iがjはパターン文字列の位置を示し、主配列の位置を表します

  1. トップ5のマッチング、6番目の文字は、この時点では、一致していない。5 = I、Jの=。5
    abcdefgab
    abcdex

  2. 此时I = 1、J = 0。
    abcdefgab
      abcdex    
    3.I = 2、J = 0。
    abcdefgab
        abcdex  
    4.I = 3、J = 0。
    abcdefgab
          ABCDE ...
    5.I = 4、J = 0;
    abcdefgab
            AB C Dを...

  3. 5 = I、J = 0;
    abcdefgab
              BC ... 
    上記マッチング処理では、ストリング""、後者"bcdex"は、等しくない、すなわち、
    [1]!T [0] Tは=
    T [0] != T [2]
    T [0]!= T [3]
    T [0]!= T [4]
    それによって決定された最初のステップで
    S [0] == T [0]
    のS [1] = T = [1]〜
    S [2] == T [2]
    Sの[3] == T [3]
    Sの[4] == T [4]
    のである
    T [0]!= S [1]
    Tは、[ 0]!= S [2]
    T [0]!= S [3]
    T [0]!= S [4]
    次いで完全に不要とステップ1(音符と2,3,4,5-ステップああ、前提はある)、私はそれのようにステップ6に直接行く
    あなたはT [0]ので、それを維持したい理由6(!= T [ 5] 最初のステップTで[5]!= Sは、[ 5] ので、私はできません[0])のT [0]とSとの関係を知って
    、それが唯一のライン上のjの値を考慮し、戻っていないバック5ステップ1-6、メインの文字列i値を
    、彼はフロント判断T [0]と、次の文字があると述べました等しいとが想定される場合、等しくない
    参照例
    メインストリングS =「abcababca」
    パターン文字列T =「abcabx」

  4. トップ5のマッチング、6番目の文字は、この時点では、一致していない。5 = I、Jの=。5
    abcababca
    abcabx

  5. ; = I ,, J = 0~1
    abcababca
      abcabx    
    3.I = 2 ,, J = 0;
    abcababca
        abcabx  
    4.I = 3 ,, J = 0;
    abcababca
          abcabx
    。5.I = 4 ,, Jが= 1;
    abcababca
          abcabx
    = 5 6.i ,, J = 2;
    abcababca
          abcabxの
    方法に従って、私たちは2最初と3を比較する、ステップを省略する省略してもよい
    4,5には、同じ理由、サブT [0 ] == T [3]ステップT [3] == S [3 ] 従って、T [0] == S [3 ]
    最後に、第6のステップは、直接

まとめ我々は、不一致が発生すると、部分文字列に一致しないものが正しい場所にジャンプすることを決定しなければならないことがわかった統合型1,2の二つの例
部分文字列を繰り返すことで決定される程度にジャンプするにはどのような位置へと、そして文字の部分文字列は、ミスマッチの程度、繰り返し度の高い、すなわち、最初の文字の位置から遠くにジャンプするまで繰り返される
(トークモードバック繰り返し最適化のこの高度再び)

ない文字は、メインの文字列と一致しない場合、私はどのような位置にジャンプを記録するために使用される次の配列にKMPアルゴリズム

位置を決定する:最長共通文字列の長さの接頭・接尾サブストリングのセットは
ここ概念2つのに組み込まれている
最後の文字が含まれておらず、最初の文字列の配列を含有しなければならない:接頭辞
、のような:ABDD接頭辞A、AB、ABDの
接尾辞を:最初の文字が含まれており、最後の順番の最後に文字列を持っていない
、例えば:ABDDサフィックスDを、DD、BDD
要約
1,2-次の2つの例対応する値
  abcdex
次の[I] -1 0 0 0 00

前記
最初の前のサブストリングにより-1示し無意味な文字列ではない
0で、無パブリック文字列をサフィックスない、前の文字列「A」、なし接頭bが2ビットを
第三の前のビットC文字列"AB"、接頭辞"A"、接尾辞"b"は、0として表さ同じストリングではない
ので、
  abcababca
次に[I] -1。1 2 0 0 0 2. 3. 1

ストリング第1ビットA前-1無意味表される文字列なし、
前の文字列「A」B 2ビット、無プレフィックス、サフィックスなし、0のない公共の文字列、
以前の文字列「AB」、接頭辞C三「A」、接尾辞「b」は、それが0を表し、同じサブない
、「AB」、接尾辞「C」、「BC」、同じではない、前の文字列「ABC」、接頭辞「A」として第列0は
"ABCA"前の文字列Bの第5ビット、接頭辞"A"、 "AB"、 "ABC"、 接尾辞"A"、 "CA"、 "BCA"、 「の最長共通ストリング"1の長さは、1を示し
abcab "接頭辞" A "" AB "第6ビット列が前である" "ABC"、" ABCA " 接尾辞" B "" AB " " CABを「」bcab「として最長共通文字列」AB」、2と2の長さを表し、
そう
で今、この場合の
T列AAAAC
次に[I] -1。1 0 2 3
[4番目の文字Tで、例えば、文字列比較を持つストリングを想像します3時刻と一致していない
「」に対応するに従い、次の[2]、すなわちスキップT [2]の位置にメインストリングと比較します
あなたはそれが必要だと思いますか?
確かに時間の無駄である、なぜならT [0] == T [1 ] == T [2] == T [3]、 T [3]が一致しない場合は、この前提によると、Tを取得する必要があります[3 ]同じ値なので、同じことは、その「父」を発見した場合であれば、それもその「父親」までに同じ「祖父」を行ってきました「父」
それはそうですので、我々はトラバーサルの最初にありますあなたは(T [N] == T [文字の"子供"(次の文字は)自分自身のように見える場合は、追加することができ 、N + 1]) [I] =次の自分の子供を置くJ(次[J])、近くの親戚jは直接の祖先で求めることができるどの程度それに層によってこのような層
は次のようなコードである
ボイドgetNextを(Sチャー*、INT *次)
{
int型LEN = STRLEN(S)は;
Iは、J int型;
I = 1;
J = 0;
次に[0] = -1;
次に[1] = 0; //は初期化
しばらく(Iがlen <)
{
(Jの== -1 || S IF [ I] == S [J])
{
++ I;
++ J;
IF(S [I] == S [J])
{
次に[I] =次に[J];
}
そうでなければ
次に[I] = J ;
}

{
J =次の[J]。
}
}
}

ストリング場合、一致を探し
//がSに位置Tを返すなし-1場合、
INT indexKmp(Sチャー*、するchar * T)
{
; I 0 = int型
INT J = 0;
int型SLEN = STRLEN(S );
INT TLENの=のSTRLEN(T);
NextをINT [32];
int型NEXTVAL [32];
getNextを(T、NEXT);
一方、(IはSLEN && J <TLEN)<
{
IFは(J S == -1 || [I] == T [J])
{
++ I;
++ J;
}

{
JがNEXTVAL [J]を=;
}
}
)J == TLEN(IF
{
I返す- STRLEN(T);
}

{
-1リターン;
}
}

おすすめ

転載: blog.csdn.net/weixin_41369611/article/details/94723311