KMP文字列照合アルゴリズム(A)

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/shipsail/article/details/102617736

KMP

マッチする文字列

0 1 2 3 4 5 6 7 8 9
A B A A C A B A B C

ターゲット文字列

0 1 2 3 4
A B A B C

プレフィックステーブル

文字列P =「ababc」

プレフィックステーブル
A
AB
ABA
ABAB
ababc

接頭辞表の役割:一致する文字列で、バックトラックを必要とするマッチング誤差を途中で会いました。(X!= C)でababxするマッチングアルゴリズムは、エラーが発生します。文字列のx ABAB最適なバックトラックポイントの前に行くと判断されます。

同じ接頭辞と接尾辞の最大長

プレフィックステーブル 接頭辞 サフィックス 最大の長さ
A - - 0
AB A B 0
ABA 、AB 、BA 1
ABAB AB、ABA B、AB、BAB 2
ababc 、AB、ABA、ABAB C、BC、ABC、babc 0

次のアレイ

そこababc場合は、この状況を無視することができますので、マッチング処理では、マッチは、成功しています。問題は、同じ接頭辞と接尾辞ABABの最大値を探し、一致ababxに発生した場合に、アレイの下方へ移動するように、最初の要素の値が-1に設定されています

指数 -1 0 1 2 3 4
文字 - A B A B C
次の値 - -1 0 0 1 2

インデックス= -1は存在しない、架空の位置です。

なぜ直接隣にジャンプ?

プレフィックス要素の接尾辞の前に次のインデックス要素最長の文字列の前と同じ:次の表は、として理解することができます。だから、直接出て、次、接尾辞、接頭==サフィックス、それが再び一致する必要はありません接頭辞で一致しました。

場合
abaacababc
ABABの
Bは、間違った最大ABA同じプレフィックスとサフィックス、0から始まるインデックスの長さを見つけるために、1は、プレフィックスの次の要素です。アブ&なぜならサフィックスにAによってマッチした、とプレフィックスとサフィックスが同じで、再びプレフィックスと一致する必要がある、エラープレフィックスのポイントと整列する要素の後にされました。つまり:B acababc ----- BAB



ここに画像を挿入説明

概要

  1. 次の計算(バックの最適化を達成するようにマッチング処理からの位置誤差、プレフィックスの最大前方位置所与同じ接尾辞、接頭辞は、エラー要素の位置と整列します)
  2. 反復処理とバック
  3. 嘆きを理解しやすい図を描き、言葉で説明するのは、このようなアルゴリズムは難しい〜

コードの実装

遼の遅すぎる今、そして明日の肝臓。

おすすめ

転載: blog.csdn.net/shipsail/article/details/102617736