[予約] KMP文字列照合アルゴリズム

著者:ルアンYifeng

日付:2013年5月1日

文字列の一致は、コンピュータの基本的な課題の一つです。

たとえば、文字列「BBC ABCDAB ABCDABCDABDE」がある、私は別の文字列「ABCDABD」が含まれている、知りたいですか?

多くのアルゴリズムは、このタスクを達成することができるクヌース-モリス-プラット法(KMPと呼ぶ)が最も一般的に使用されるの一つです。これは、Kは、有名な科学者ドナルド・クヌースの始まりである、3つの発明者の名前。

このアルゴリズムを理解することは容易ではない、そこに多くのオンラインの説明は、それは非常に激しい読み込みます。読み込みまではジェイクボクサーの記事を、私は本当にアルゴリズムを理解しています。さて、私は理解しKMPアルゴリズムのより良い説明を書き込もうと、独自の言語を使用しています。

1。

まず、文字列「BBC ABCDAB ABCDABCDABDE」検索用語「ABCDABD」比較のための最初の文字、の最初の文字。AとBが一致していないので、検索用語シフト後のようにします。

2。

AとBは、検索語とその後、後方一致しないので。

3。

このように、これまでの検索語の最初の文字と同じ文字列、まで。

4。

そして、文字列と検索語の次の文字、またはそれを比較します。

5。

検索ワードの文字に対応する文字列があるまで、これまでと同じではありません。

6。

このとき、最も自然な反応は何度も何度シフト後の全体の検索語がリンゴにリンゴを比較することです。あなたは、「検索場所」移動したいので、そうすることが可能な、しかし効率が悪いですが、位置を比較し、再びそれより重いです。

7。

基本的な事実は、スペースとDが一致しないとき、あなたは実際には最初の6つの文字が「ABCDAB」を知っているということです。KMPアルゴリズムのアイデアが戻って移動しない「検索位置」に、この既知の情報を使用しようとする位置を比較し、それはこのように効率を向上させ、後方に移動し続けます。

8。

これをどのように行うには?あなたは「部分一致テーブル」(部分一致表)を計算するために、単語を検索することができます。どのようにこのテーブルには、当時、生成されるが、ここでそれを単に使用しています。

9。

Dは、スペースを知られており、最初の6つの文字「ABCDAB」一致と一致していません。ルックアップテーブルは、「部分一致する値」に対応する最後の一致文字Bは、2であり、見ることができる運動後方次式により算出されるビット数そう:

  シフトビット数=一致する文字の数 - 部分一致に対応する値

4に等しい6--2、そのバック4つの検索語に移動ので。

10。

スペースとCが一致しないので、検索語は後方いきます。この場合には、一致した文字の数は、「一致する値の一部」に対応する、(「AB」)2であり、0です。したがって、シフトビット数= 2--0、結果は、2つの検索語が後方にシフトし、2です。

11。

スペースは、継続的なシフトの後、Aと一致していませんので。

12。

ビット単位の比較、CとDの発見は一致していないまで。次に、シフトビット数= 6--2、検索語は、後方に4を移動し続けます。

13。

検索語の最後のビットまでのビット単位の比較、正確に一致するので、検索が完了しています。あなたはまた、中央値= 7--0を移動する、(すなわち、すべてのマッチングを見つける。)検索を続けたい、その後、後方に7を移動するための単語を検索する場合、ここでそれを繰り返すことはしません。

14。

ここで「部分一致リストは、」生成する方法であるです。

まず、我々は二つの概念を理解する必要があります:「接頭辞」と「接尾辞を。」「プレフィックス」、すべてのヘッドアセンブリの列の最後の文字に加えを指し、「接尾辞」は、文字列の末尾の最初の文字以外のすべての組成物を意味します。

15。

「部分一致値は」「接頭辞」と最長共通要素の「接尾語」の長さです。例えば「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は、共通の要素の長さです。

16。

本質的には「部分一致」は、時々、頭と尾の文字列が繰り返されます。例えば、二つの「AB」、それは「部分一致する値」に「ABCDABは」2(長さ「AB」)です。検索語を移動する場合、最初の「AB」後進4(文字列長 - 部分一致値)が、第二の「AB」位置に来ることができます。

(終わり)

ます。https://www.cnblogs.com/ericsun/p/3334084.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34352449/article/details/93154976