web-dev-qa-db-ja.com

ラビン-カープまたはKMPアルゴリズムをいつ使用するか?

次のアルファベットを使用して文字列を生成しました。 _{A,C,G,T}_。そして私の文字列には10000文字以上が含まれています。その中で以下のパターンを探しています。

  • ATGGA
  • TGGAC
  • CCGT

実行時間がO(m+n)の文字列照合アルゴリズムを使用するように依頼しました。

_m = pattern length
n = text length
_

両方の_KMP and Rabin-Karp algorithms_にこの実行時間があります。この状況で(Rabin-CarpとKMPの間で)最も適切なアルゴリズムは何ですか?

21
Sukeshini

複数のパターンを検索する場合、通常、正しい選択は Aho-Corasick を使用することです。これは、 [〜#〜] kmp [〜#〜] の一般化です。 =。今あなたの場合、あなたは3つのパターンしか検索していないので、KMPはそれほど遅くない(最大で3倍)場合もありますが、これは一般的なアプローチです。

Rabin-Karp 衝突が発生しないと仮定すると実装が簡単になりますが、問題が一般的な文字列検索である場合、KMPはどの入力を使用してもより安定します。ただし、Rabin-Karpには他にも多くのアプリケーションがあり、KMPはオプションではありません。

21