この記事では、導入することであるが何であるかを BFアルゴリズム、KMPアルゴリズムは、BMアルゴリズムがあるトリロジーの一つ。
KMPアルゴリズム関与内部数学的原理や、あまりにも多くの知識、この記事では、唯一のでしょうKMPアルゴリズム実行中のプロセス、マッチングテーブルの一部は、次の配列が導入され、あなたが他の読みについて移動するには、これらの三点を理解していればKMPアルゴリズムの記事を確かに持っています明確な理解。
以下のテキスト記述は、ビデオアニメーションと併せてお読みください〜
ビデオ住所:https://www.bilibili.com/video/av60334201/
定義
K nuth- M orris- P RATT文字列検索アルゴリズムは、と呼ばれるKMPアルゴリズムしばしばPは、テキスト文字列Sに表示されるパターン文字列の位置を見つけるために使用されます、
このアルゴリズムは、ヴォーン・プラット、共同で1977年にドナルド・クヌースによって公開ジェームス・H・モリストリオので、彼らは、アルゴリズムにちなんで名付けられた3人を選びました。
ドナルド・クヌースは非常に馴染みの名前を感じていないですか?はい、目の前でクヌースシャッフルアルゴリズムの説明おそらく最高の記事も彼に現れた記事を!
以下は、直接与えられているKMPアルゴリズムの動作フロー:
- 今では、位置iにテキスト文字列Sに一致すると仮定し、パターン列Pの位置と一致するように、J
- もしJ = -1、または現在の文字のマッチングが成功した(すなわち、S [i]を== P [jは ])、 私は、j個の++ ++を作ってきた、次の文字にマッチし続け;
!もしJ = -1、および現在の文字を(一致しません即ち、S [i]は!= P [ J])、 私のために同じ、J =次の[J]。つまり、ミスマッチ、テキストストリングSに対するパターン列Pが右jに移動される-次の[J]ビット - 換言すれば、インデックス位置は、パターン文字列の不一致次配列パターン列Pミスマッチ位置Pの値に対応します
〜を理解していませんか?直接映画を参照してください!
実行プロセス
パターン文字列Pによる次のテキストや文字列S例:
まず、すべてのパターン文字列Pの部分文字列をリスト:
A | |||||||
---|---|---|---|---|---|---|---|
A | B | ||||||
A | B | A | |||||
A | B | A | A | ||||
A | B | A | A | B | |||
A | B | A | A | B | C | ||
A | B | A | A | B | C | A | |
A | B | A | A | B | C | A | C |
その後、それぞれが接尾サブストリングのすべての接頭辞で得られました。
プレフィックスは、すべてのヘッドアセンブリの列の最後の文字を除いていい、サフィックスは文字列の最初の文字を除いて総尾の組み合わせを指します。
実証する例として、第5列。
接頭辞があります
A | |||
---|---|---|---|
A | B | ||
A | B | A | |
A | B | A |
サフィックスがあります
B | |||
---|---|---|---|
A | B | ||
A | A | B | |
B | A | A | B |
従って、プレフィックスの共通の要素の最大長さであり、添え字である2。
対応するサブストリング接頭辞と接尾辞の共通の要素のそれぞれの元のパターン列P得るテーブルの最大長さ以下です。
テーブルの最大長求める次の配列を:次のアレイは、初期値が割り当てられ、「最大長」を右に全体の動きに対応する-1。
まあ、取得次のアレイを、後にKMPアルゴリズムの操作は非常に明確です。
文字パターン文字列のPとSは不一致パターン文字列が右に移動したとき、1に一致するテキスト文字列です。
移動する方法?
比如模式串的 b 与文本串的 c 失配了,找出失配处模式串的 next数组 里面对应的值,这里为 0,然后将索引为 0 的位置移动到失配处。