web-dev-qa-db-ja.com

レーベンシュタイン距離アルゴリズムはO(n * m)より優れていますか?

私は高度なレーベンシュタイン距離アルゴリズムを探していました。 これまでに見つけた中で最高のもの はO(n * m)で、nとmは2つの文字列の長さです。アルゴリズムがこのスケールである理由は、次のような2つの文字列の行列の作成により、時間ではなく空間のためです。

alt text

O(n * m)よりも優れた一般公開されているレーベンシュテインアルゴリズムはありますか?私は高度なコンピューターサイエンスの論文と研究を見ることに嫌悪感はありません、しかし何も見つけることができませんでした。私は1つの会社、Exorbyteを見つけました。Exorbyteは、超先進的で超高速のレーベンシュタインアルゴリズムを構築していると思われますが、もちろん企業秘密です。レーベンシュタイン距離計算を使用したいiPhoneアプリを作成しています。 利用可能なObjective-C実装があります ですが、iPodおよびiPhoneのメモリ容量には限りがあるため、可能であればより良いアルゴリズムを見つけたいと思います。

41
Jason

時間の複雑さまたはスペースの複雑さを減らすことに興味がありますか?平均時間の複雑さはO(n + d ^ 2)に削減できます。ここで、nは長い文字列の長さ、dは編集距離です。編集距離のみに関心があり、編集シーケンスの再構築には関心がない場合は、行列の最後の2行をメモリに保持するだけでよいので、order(n)になります。

近似する余裕がある場合は、多対数近似があります。

O(n + d ^ 2)アルゴリズムについては、Ukkonenの最適化またはその拡張 Enhanced Ukkonen を探します。私が知っている最高の近似はこれです Andoni、Krauthgamer、Onak

43
srean

距離が特定のしきい値を下回っているかどうかをテストするなど、しきい値関数だけが必要な場合は、配列の主対角線の両側のn値のみを計算することで、時間と空間の複雑さを軽減できます。 Levenshtein Automata を使用して、O(n)時間で単一の基本単語に対して多くの単語を評価することもできます。オートマトンの構築はO(m)時間も。

10
Nick Johnson

ウィキを見てください-彼らはこのアルゴリズムを改善してスペースの複雑さを改善するいくつかのアイデアを持っています:

Wiki-Link:レーベンシュタイン距離

引用:

前の行と現在の行を一度に格納するだけでよいので、アルゴリズムを使用して、より少ないスペースを使用するように、O(m) O(mn)の代わりに)できます。

2
Dani

私はO(max(m、n))であると主張する別の最適化を見つけました:

http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#C

(2番目のC実装)

0
nponeccop