KMPアルゴリズムを理解します

 

KMPマッチングアルゴリズムは、暴力によって導入---->

暴力マッチングアルゴリズム


 問題:テキスト文字列S、及びパターン文字列Pがあり、Pは今Sに場所を見つけるために

 暴力のマッチング、そして今仮定のアイデアは、位置iにテキスト文字列Sに一致した場合、jはパターン列Pの位置を一致させるために、あります。

  • 現在の文字(すなわち、S [I] == P [J])成功した​​一致する場合、I ++、J ++、次の文字にマッチし続けます。
  • (J - - 1)、J = 0私は、私を=だから不一致(!つまり、S [i]は= P [J])、あれば。各マッチに対応する障害が、私はバックトラック場合、jを0に設定されています。(良いフル-J-1ひっくり返っの以前にマッチした文字列)

 

上記の例P以下:( S)

ここでのマッチングの例、:

 

 この試合では行くことがあります。

 

 ここに一致するものがありません。

 

ロールバックが再び開始するために戻って行きます。

 

このロールバック質問です:

ステップ4に一致する前に、我々は、S [5] = P [1] = B、及びP [0] = A、即ち、P [1]!= P [0]、そうS [5]なければならないということを学びましたP [0]に等しくない場合、それは必然的に過去のミスマッチをバックつながります。

それは我々が前に戻っは無用であるバックトラック、赤いボックスAを、以下の意味するものではありません知っていたS図Bの赤いボックスに、です。

誰アルゴリズムは存在しないことを、私は戻って戻ってないので、ちょうどjにそれを移動?

YES  ===> KMPアルゴリズム、一部はそれを使用する前に有効な情報を有するマッチングは、iが可能なように限り、位置jを変更することによって、バック保持されていない有効な位置にパターン文字列という。

 

KMPアルゴリズム

クヌース-モリス-プラット文字列検索アルゴリズム、多くの場合に使用される、「KMPアルゴリズム」と呼ばれるPは、テキスト文字列Sに表示されるパターン文字列の位置を見つけ、ドナルド・クヌース、ヴォーン・プラット、ジェームズ・H.のアルゴリズムモリス3上をそれは、アルゴリズムにちなんで名付けられた3人の男性を選んだように、1977年に共同で発表しました。

KMP(続く詳細に説明)第一処理アルゴリズム以下直接与えられます。

テキスト文字列がS試合はi、jはパターン列Pの位置に一致するように配置することになりましたと仮定します。

  • もし= -1次の[J]、または現在の文字のマッチングに成功した(すなわち、S [i]は== Pは[J])は、iが++、J ++は、次の文字にマッチし続けてきました。
  • 次の[j]は!= -1、および現在の文字が一致しなかった場合(つまり、S [i]は!= P [J])、私のために同じ、J =次の[J]。この手段ときにミスマッチ、右Sにテキスト文字列を移動に対するパターン列P jを - 次の[J]ビット。(暴力Iに一致するように上記移動とは異なり)

例:

一致するものがないことが判明した場合、その後は上記の例を見て:

 

その後、我々は(ここではフォールバックし、私が変更されていない、右にJ移動4 ==>なぜあなたはので、移動4の後に、それを右に4を移動させたい、とS [8を続行することができ、文字列のパターン「AB」があったん私はバックトラックはできませんので] S [9]に対応し、):KMPアルゴリズムのアイデアは、位置を比較したバック移動しないように「検索位置」に、この既知の情報を使用しようとすることです、それはそう、後方に移動し続けます効率を改善します。

 

不一致のビットパターン文字列が右に移動しているときに、ことがわかる:マッチした文字の数 - 文字に対応する文字の最大長の不一致

 

完全な例

今それを持って与えられたテキスト文字列「BBC ABCDAB ABCDABCDABDE」、およびパターン文字列「ABCDABDは」、テキスト文字列パターン文字列マッチングに話をする場合。

シフトビット数=一致する文字の数-部分一致に対応する値を   ==>最大長テーブル/ NEXTアレイ

各サブストリングのストリングプレフィックスに対応する元のパターンの最大長さと共通の要素にサフィックステーブル/次配列です。

私たちは、テーブルが構築される方法を見て:

(また、「部分一致値」と呼ぶ)の最大長は、「接頭辞」および「サフィックス」最長総要素の長さです。例えば「ABCDABD」に、

  - 「A」接頭辞と接尾辞空集合は、共通の要素の長さが0です。

  - 接頭辞「AB」は[A]であり、サフィックスは、共通の要素の長さは0であり、[B]です。

  - 接頭辞 "ABC" は[A、AB]、サフィックス[BC、C]、0の共通要素の長さです。

  - [A、AB、ABC]に "ABCD" の接頭辞、接尾辞[BCD、CD、D]、共通の要素の長さが0です。

  - 接頭辞 "ABCDA" は[A、AB、ABC、ABCD]、サフィックス[BCDA、CDA、DA、A]、共通要素として、 "A"、長さ1です。

  - 接頭辞 "ABCDAB" は[A、AB、ABC、ABCD、ABCDA]、サフィックス[BCDAB、CDAB、DAB、AB、B]、 "AB"、2の長さの共通要素です。

  - "ABCDABD" は接頭辞[A、AB、ABC、ABCD、ABCDA、ABCDAB]、サフィックス[BCDABD、CDABD、DABD、ABD、BD、D]、0は、共通の要素の長さです。

 

 

 そして、上記のアルゴリズムのプロセスを介してコピーします。

  • もし= -1次の[J]、または現在の文字のマッチングに成功した(すなわち、S [i]は== Pは[J])は、iが++、J ++は、次の文字にマッチし続けてきました。
  • 次の[j]は!= -1、および現在の文字が一致しなかった場合(つまり、S [i]は!= P [J])、私のために同じ、J =次の[J]。この手段ときにミスマッチ、右Sにテキスト文字列を移動に対するパターン列P jを - 次の[J]ビット。(暴力Iに一致するように上記移動とは異なり)

 

次のように例えばマッチングプロセスです。

 

1. B、B、Cと文字のパターン文字列のテキストAの文字列の文字は、スペース、テキストと文字のモードA列になるまで継続することができ、直接正しいものにマッチパターン文字列の先頭ではないので5番目の文字列成功したマッチ:

 

2.一致不一致パターン文字列と最後の文字Dパターン文字列のテキスト文字列が右に移動する必要がある場合、次の試合に進みます。どのように多くんが、右に移動?この時点で6(ABCDAB)と一致する文字の数を有しているので、その後、文字Dに従って損益は「最大長さ」であってもよい2の値に対応する文字Bの長さを示しているので、以前の結論に従って、右モバイル6--2 = 4。


3. 2つの文字が一致しているので、再び(AB)、Cミスマッチで見出さ右にパターン文字列4、及び移動0の最大長さの値に対応する文字Bを、それが右に移動します: 2--0 = 2。

 

スペース4. Aのミスマッチ、右に1移動します。

 

6マイナス一致する文字の数:比較は継続し、DおよびCは、不一致ビット数こと右ように移動している見出さ2の最大長さに対応する文字Bが - = 4 2、即ち、右方への移動6 。

 

6.ステップ5(CDABD部分一致)を経験した後に、成功したマッチは、処理を終了見出されます。

マッチング処理によってわかるように、重要な問題があるために、最大長さの同じ接頭辞と接尾辞パターン文字列を見つける一致に基づいを、。

 

参考1 

参考2

参考3

おすすめ

転載: www.cnblogs.com/shona/p/12571167.html