文字列のセットに近い文字列はいくつありますか?


7

この質問は、高速なスペルチェッカーを構築するための効率的なデータ構造によって促されました。

2つの文字列が与えられた u,v、私たちは彼らがそうだと言います k-それらのダメラウ–レヴェンシュタイン距離 ¹が小さい場合、つまりLD(u,v)k 固定の kN。非公式に、LD(u,v) 変換に必要な削除、挿入、置換、および(隣接)スワップ操作の最小数です uv。それはで計算することができますΘ(|u||v|)動的プログラミングによる。ご了承くださいLDメトリックであり、特に対称的です。

関心のある問題は次のとおりです。

セットを考える Sn ひも Σ 長さが最大 m、のカーディナリティは何ですか

Sk:={wΣvS. LD(v,w)k}

同じ長さの2つの弦でも数が異なるため k-closestrings²一般的な式/アプローチは見つけるのが難しい(不可能?)場合があります。したがって、所定の数ごとに明示的に数を計算する必要があるかもしれませんS、主な質問に私たちを導きます:

セットのカーディナリティを見つけることの(時間)複雑さは何ですか {w}k (任意) wΣ

必要な量は指数関数であることに注意してください |w|なので、明示的な列挙は望ましくありません。効率的なアルゴリズムは素晴らしいでしょう。

それが役立つ場合は、実際に(大規模な)セットがあると想定できます。 S 文字列の、それは私たちが最初に強調表示された質問を解決することです。


  1. 可能な変形には、代わりにレーベンシュタイン距離の使用が含まれます。
  2. 検討する aa そして ab。のセット1-文字列を閉じる {a,b}{a,aa,ab,ba,aaa,baa,aba,aab} (8ワード)および {a,b,aa,bb,ab,ba,aab,bab,abb,aba} (10ワード)、それぞれ。

強調表示された質問は基本的にk最近傍検索ではありませんか?より具体的には、空間インデックスについて考えています。Mツリーとそのバリアントなどの任意のメトリック(いくつかの制約付き)を使用した効率的なk-NNクエリをサポートするデータ構造があります。私は何かを逃していますか、これはこれでうまくいくと思いますか?
Juho

@mrm確かに、それはうまくいきます- ある長さまで指数関数的に多くの単語をすべて書き留める場合(私はしたくない)、すべてのペアワイズアラインメントを計算し(回避したい)、次にツリーを構築します。
ラファエル

1
@mrm:今考えてみると、 k最近傍は問題を解決しません。(固定距離までの)すべての近傍を検索します。
ラファエル

そう、それは範囲クエリ検索です。この件に関しては、膨大な量のデータと大規模なデータベースについて、かなりの研究が行われていると思います。しかし、とにかく、私は今あなたの主張を理解しています。多分もっと賢い方法があります:)
Juho

いくつかの簡単な観察:(1)削除のみが許可されている場合、(2番目の)問題は多項式です。(2)カウントの境界はO((|w|+k)k)
rgrig

回答:


1

レーベンシュタインの論文を参照してください。これには、文字列の挿入と削除から取得した数値文字列の境界が含まれています。もしn は文字列の長さであり、文字列はバイナリであり、レーベンシュタイン距離の最近傍の最大数は Θ(n2)。何も言うのは比較的難しいですk-最も近い隣人ですが、境界を得ることができます。これらはあなたに複雑さの見積もりを与えるはずです。


ありがとうございます。ただし、これは正しい指標ではなく、バイナリアルファベットでも十分ではありません(ただし、アルファベットのサイズはおそらく質的な影響はありません)。私はロシア語が話せないので、結果を簡単に転送できるかどうかを確認できません。
ラファエル

境界は見つけやすいように見えますが、質問では正確な数を求めます。@Raphaelは間違っていますか?
rgrig

あなたが見つけることができるはずのレーベンシュタインの論文の英語版があります。また、一般的なアルファベットの境界も含まれています。
アンクル

@rgrig:質問は正確な数を要求しますが、(良い)範囲は高く評価されます。
ラファエル

0

もしあなたの k 修正され、前処理を行うことが許可されている場合、これはあなたが試すことができるものです

  1. ノードが単語で、2つの単語間の距離が1の場合、2つのノード間にエッジが存在するようにグラフを作成します。
  2. そのグラフに対応する隣接行列を取得します(たとえば、 M
  3. 計算する Mk

これで、最終的なマトリックスを使用してすべてのクエリに回答できるようになります。保存できればMM2M4M8 等。あなたはより広い範囲で答えることができるかもしれません k 固定の代わりに kもちろん、ここでは行列乗算のコストを支払います。


これはかなり素朴な手順ですね。すべてのペアワイズ距離を計算し、深さまで幅優先検索を実行するkすでにより効率的です。
ラファエル

上記で作成したグラフで、幅優先検索を意味すると想定しています。その場合、実行するすべてのクエリに対して検索を実行します。これは列挙型(質問で指定したくないもの)と同じです。上記の私の返答で、私は計算しますMk前処理ステップとして、これは一度だけ実行する必要があります。その後、クエリごとにその行列の行/列を通過するだけでよいので、応答時間が速くなります。
TenaliRaman

1
どちらの方法でも、前処理として「実際の」作業を隠すことができます。ご了承くださいM 最大長が指数関数的に大きい なので、「行/列を通過するだけ」では効率的ではありません。距離自体を計算することは、ここでのボトルネックではありません。(必要になるでしょうΣ=1kM、ちなみに)
ラファエル

実は Mnum_words x num_wordsです。また、ブール値であり、おそらく非常にまばらです。なぜか分かりますか?
TenaliRaman、

はいといいえ。 Skすべての近い単語を含み、指数関数的に多くの単語がある、すなわちnum_words =2メートル。明確にするために質問を編集しました。
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.