BFアルゴリズム、RKアルゴリズム - 文字列照合アルゴリズムに

アウトライン

RKアルゴリズムBFアルゴリズムとアルゴリズムは、単一のパターンマッチングです。いわゆるシングルストリングパターンマッチングアルゴリズムは、文字列と文字列の一致のために人気があります

共通の単一の文字列のパターンマッチングアルゴリズムだけでなく、BMアルゴリズムとKMPアルゴリズム。

 

対照的に、文字列に複数の文字列に対して同じ時間外観、共通ACおよびトライ木オートマトンであるマルチパターンマッチングアルゴリズムです。

 

二つの概念

 

パターン文字列と文字列メイン

 

私たちは、メインの文字列である文字列は、文字列がモードB列で、文字列A列Bを探します。

メインの文字列の長さが示されるN、パターン文字列の長さMと呼びます。私たちは、メインの文字列なので、N> Mのパターンを探していますので。

 

 

BFアルゴリズム

BFは、ブルートフォースの頭字語であり、中国はまた、単純なマッチングアルゴリズムとして知られ暴力マッチングアルゴリズムと呼ばれます。

文字列照合アルゴリズムは非常に「暴力的」である。この方法では、ロジックは、理解しやすいシンプルですが、対応するパフォーマンスは高くありません。

 

BFのアルゴリズムを考えます

考えるBFアルゴリズムは、一つの文にまとめることができます。

我々メインストリーム、開始位置は、パターン文字列マッチングかどうかを確認するために、0,1,2 ... nmおよびNM + 1のm個のサブストリングの長さをチェックしています。

このようなアルゴリズムやアイデア、極端な場合であれば:メインの文字列が「aaaaaaaaaaaaa ......」(省略多数A)である場合、パターン文字列が「aaaaab」です。

N-M + 1回以上メートルの文字より私達のそれぞれ。

したがって、このアルゴリズムの最悪の場合の時間複雑度はO(N * M)です。

 

該当シーンBFアルゴリズム

理論的には、アルゴリズムの時間複雑度が高いBFであるが、O(N * M)であるが、実際にはより一般的に、文字列マッチングアルゴリズムです。

2つの主な理由があります:

  1. ほとんどの場合、パターン文字列とメインの文字列の長さが長すぎるではありません。そして毎回、メインパターン文字列の文字列の部分文字列マッチング、時間を一致させることはできませんハーフウェイの出会いの文字は、あなたが停止することができたときに、見に比べてm個の文字にする必要はありません。だから、理論的な最悪の場合の時間の複雑さにもかかわらず、O(N * M)であるが、統計的に、ほとんどの場合、アルゴリズムの効率はこれよりはるかに高いです。
  2. アルゴリズムのBFのアイデアは、コードの実装は非常に単純で、簡単です。エラーしにくいシンプル手段、また公開し、バグ修正する可能性がある場合。プロジェクトでは、性能要件を満たしながら、シンプルさが好ましいです。これはまた、我々は、多くの場合、KISSは、(シンプルで愚かなことをしてください)と言う設計原理です。

 

RKアルゴリズム

RKアルゴリズムの完全な名前は、その発明ラビンとという名前の2つのカープの名前で、ラビン - カープアルゴリズムと呼ばれます。

 

RKアルゴリズムは、より多くのBFアルゴリズムのアップグレード版のようなものです。

モードBFアルゴリズムはMの長さ、メインストリングの長さnは、メインストリームにそれを実行すると、部分文字列のN-M + 1メートル長さが存在することになります。

私たちは、あなたがメインの文字列と部分文字列のパターンマッチングを識別することができ激しくN-M + 1番目の文字列と文字列のモデルを比較する必要があります。

しかし、各チェックメインストリングサブストリングの一致と、各文字がターンオーバーする必要があり、アルゴリズムの時間計算量は(N * M)が比較的高いBFはOです。

わずかに変更するためのBFアルゴリズムは、ハッシュアルゴリズムを導入し、時間複雑性は直ちに減少します。

 

思想RKアルゴリズム

ハッシュ値のサブN-Mのメインストリングは、それぞれ、ハッシュ値列のパターンサイズとの比較により+ハッシュアルゴリズム、次にいずれかを求めます。

ハッシュ値サブパターン文字列が等しい場合は、表示されていること、対応するサブストリングとパターンマッチング。

ハッシュ値が数値であるため、比較は比較が増加されるだろうサブストリングデジタル、シリアルとモデル効率との間の平等のための非常に高速です。

 

ハッシュ値は、ハッシュアルゴリズムをサブストリングによって計算されている場合でも、我々は、サブストリングの各文字を反復処理する必要があります。

パターン文字列とサブ比較器効率が向上しているが、しかし、アルゴリズムの全体的な効率が改善されませんでした。

我々は、効率的なハッシュアルゴリズム部分文字列のハッシュ値である必要があります。

そして、ハッシュ値を計算し、まだ問題のハッシュの衝突があります。だから、RKアルゴリズムのコアは、まだハッシュ関数の設計です。

ハッシュシンプルかつ効率的機能、およびハッシュ衝突の確率を低減する必要があります。

 

文字列がアルファベットのA〜Zのみ26の文字が含まれているとします。例えば小型から大型の素数への手紙のうちの対応する1つのそれぞれの、我々はできる文字列の各文字について

一緒に数字、そして最後にハッシュ値として得られます。そのようなAの衝突の確率が少し低下します。

 

ハッシュの衝突があった場合、ハッシュ値が存在し得るが、サブストリングとパターン文字列が同じであるが、両者は、それ自体と一致しません。

このメソッドは、オブジェクトが問題(のhashCodeとequals)の話ボーエンを比較する前に比較することができます解決するために非常に簡単です。

 

我々は、サブストリングのハッシュ値がハッシュ値を持つパターン文字列に等しい見つけたとき、私たちはうまく突然文字列と文字列のパターン自体のすべてを比較する必要があります。

パターン文字列のハッシュ値をサブストリングのハッシュ値が等しくない場合、対応するサブストリングパターン文字列と確かに一致していない、不要文字列とパターンよりもストリング自体は存在しません。

 

RKアルゴリズムは、ハッシュアルゴリズムの設計に集中することです。

ハッシュアルゴリズムの衝突確率は比較的低く制御することができます。紛争の多くがあれば、それはアルゴリズムRK分解効率の時間複雑さにつながります。

極端な場合には、衝突の場合に多量毎回その後、時間複雑性O(N * M)に退化しますパターン文字列と部分文字列の比較自体が、存在します。

しかし、通常の状況下では、ハッシュアルゴリズムの設計が合理的である、そして、競合は多くはありません、RKアルゴリズムの効率はまだBFアルゴリズムよりも高くなっています。

 

 

 

公開された113元の記事 ウォン称賛25 ビュー30000 +

おすすめ

転載: blog.csdn.net/qq_42006733/article/details/105072014