web-dev-qa-db-ja.com

Knuth-Morris-PrattとBoyer-Mooreの検索アルゴリズムの主な違いは何ですか?

Knuth-Morris-Pratt検索アルゴリズムとBoyer-Moore検索アルゴリズムの主な違いは何ですか?

[〜#〜] kmp [〜#〜]はXでYを検索し、Yでパターンを定義しようとし、パターンをベクトルに保存します。 [〜#〜] bm [〜#〜]は、DNA(ACTG)のような小さな単語に対してより効果があることも知っています。

動作の主な違いは何ですか?どちらが速いですか?どちらがコンピュータ欲張りではありませんか?どの場合に?

41
ghaschel

MooreのUTexas Webページ 両方のアルゴリズムを段階的に説明します(さまざまな技術資料も提供しています)。

男自身によると、

古典的なボイヤー・ムーアアルゴリズムは、DNAのような小さなアルファベットではあまり効率的に動作しない傾向があるという現象に悩まされています。部分文字列が頻繁に再発生するため、スキップ距離はパターンの長さとともに大きくなる傾向があります。すでに一致したものをより多く覚えておくことで、テキストを大きくスキップすることができます。 「完全な記憶」を配置して、各文字を最大1回だけ見ることもできますが、ボイヤー・ムーアアルゴリズムは線形ではありますが、テキストから文字を複数回検査する場合があります。より多くを記憶するというこの考えは、他の人によって文献で探究されてきました。非常に大きなテーブルまたはステートマシンの必要性に苦しんでいます。

しかし、いくつかの BMの変更 があり、小さなアルファベットの検索が実行可能になりました。

30
David Titarenco

大まかな説明で

Boyer-Mooreのアプローチは、パターンの最後にマッチしない場合、最初にマッチするのではなく、最後にマッチしないと仮定することです最初に一致させる必要があります。これにより、「大きなジャンプ」が可能になります。したがって、[〜#〜] bm [〜#〜]は、検索するパターンとテキストが "ナチュラルテキスト」(英語)

Knuth-Morris-Prattは、不一致が発生した場合、 Word自体は、次の一致を開始できる場所を決定するのに十分な情報を組み込んでおり、以前に一致した文字の再検査をバイパスします。 (出典: Wiki

つまり、[〜#〜] kmp [〜#〜]は、DNA(ACTG)のような小さなセットに適しています。

35
gtgaxiola

ボイヤー・ムーアのテクニックは、キャラクターを右から左に一致させ、長いパターンでうまく機能します。 knuth moris prattは、左から右に文字を一致させ、短いパターンで高速に動作します。

2
Sadaf Khursheed