タグ付けされた質問 「string-metrics」

2
高速スペルチェッカーを構築するための効率的なデータ構造
私はかなり大きな辞書で動作するはずのスペルチェッカーを書こうとしています。Damerau-Levenshtein距離を使用して、スペルミスの単語に最も近い単語を判断するために使用する辞書データを効率的にインデックス化する方法が本当に必要です。 私は、スペースの複雑さとランタイムの複雑さとの間の最適な妥協点を提供するデータ構造を探しています。 インターネットで見つけたものに基づいて、使用するデータ構造のタイプに関していくつかのリードがあります。 トライ これは私の最初の考えであり、実装が非常に簡単に見えるため、高速なルックアップ/挿入を提供するはずです。Damerau-Levenshteinを使用した近似検索は、ここでも簡単に実装できるはずです。しかし、ポインタストレージでは多くのオーバーヘッドが発生する可能性が高いため、スペースの複雑さに関してはあまり効率的ではありません。 パトリシア・トライ 基本的にポインターを保存するコストを回避しているため、これは通常のトライよりもスペースを消費しないようですが、私が持っているような非常に大きな辞書の場合、データの断片化が少し心配です。 サフィックスツリー これについては定かではありませんが、テキストマイニングで便利だと思う人もいるようですが、スペルチェッカーのパフォーマンスの面で何が得られるのかはよくわかりません。 三項検索ツリー これらはかなり見栄えがよく、複雑さの点ではパトリシアトライスに近い(より良い?)はずですが、パトリシアトライスよりも良いか悪いかは分からないでしょう。 バーストツリー これは一種のハイブリッドのようであり、トライスなどに比べてどのような利点があるかはわかりませんが、テキストマイニングには非常に効率的であると何度か読みました。 このコンテキストで使用するのに最適なデータ構造と、他のデータ構造よりも優れている点についてフィードバックを受け取りたいと思います。スペルチェッカーにさらに適切なデータ構造が不足している場合、私も非常に興味があります。

2
Cのvoid型がempty / bottom型と類似していないのはなぜですか?
ウィキペディアと私が見つけた他のソースはvoid、空のタイプではなくユニットタイプとしてリストCのタイプを見つけました。void空の/下の型の定義によりよく適合するように思えるので、この混乱を見つけます。 void私が知る限り、値は存在しません。 戻り値の型がvoidの関数は、関数が何も返さないため、何らかの副作用しか実行できないことを指定します。 タイプのポインターvoid*は、他のすべてのポインタータイプのサブタイプです。また、void*C との間の変換は暗黙的です。 最後の点voidに、空の型であることの引数としてのメリットがあるかどうかはわかりvoid*ませんvoid。 一方、voidそれ自体は他のすべてのタイプのサブタイプではありません。これは、タイプがボトムタイプであるための要件であると言えます。
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

1
一意の要素を持つリストの距離を編集
リスト間のレーベンシュタイン距離編集距離はよく研究された問題です。しかし、各リストで要素が複数回出現しないことがわかっている場合、可能な改善についてはあまり見つけることができません 。 また、要素が比較可能/ソート可能であると仮定します(ただし、比較するリストは最初からソートされていません)。 O(min(m,n)s)O(min(m,n)s)O(\min(m,n)s)O(min(s,m,n)s)O(min(s,m,n)s)O(\min(s,m,n)s)sss より正式には、 与えられた2つの文字列間の編集距離は 文字が繰り返されないという約束で、どの程度効率的に計算でき ますか?s,t∈Σ∗s,t∈Σ∗s,t \in \Sigma^* ΣΣ\Sigmaは非常に大きなアルファベットです。

1
Earley Parserは、DFAのLevenshtein Automata Algoのようなファジーパーサーにできますか?
DFAと実行時に入力された単語のLevenshtein Automataを実行して、あいまいな解析を実行する方法があります(タイプミスがある場合でも文字列を受け入れます)。Earleyパーサーでも同様のことができますか?アルゴリズムを理解するのは難しいと思います。この質問に答えることは言うまでもありません。

2
高速k不一致文字列マッチングアルゴリズム
高速なk不一致文字列マッチングアルゴリズムを探しています。長さmのパターン文字列Pと長さnのテキスト文字列Tが与えられた場合、Pが最大でk個の不一致を持つTの部分文字列と一致するすべての位置を見つけるための高速(線形時間)アルゴリズムが必要です。これは、k差問題(編集距離)とは異なります。不一致は、部分文字列とパターンの最大k個の位置に異なる文字があることを意味します。本当に必要なのはk = 1(最大で1つの不一致)だけなので、k = 1の特定のケースに対する高速アルゴリズムでも十分です。アルファベットのサイズは26(大文字と小文字を区別しない英語のテキスト)であるため、スペースの要件はアルファベットのサイズに比例して大きくなりすぎないようにする必要があります(たとえば、FAASTアルゴリズムは、アルファベットのサイズで指数関数的にスペースを取るなど)。タンパク質および遺伝子配列にのみ適しています)。 ダイナミックプログラミングベースのアプローチは、最悪の場合O(mn)になる傾向があり、遅くなります。私はこのためのボイヤー・ムーアアルゴリズムの変更があると信じていますが、私はそのような論文を手に入れることができません。私は学術雑誌や出版物にアクセスするためのサブスクリプションを持っていないので、すべての参照はパブリックドメインにある必要があります。 私は、ポインタ、または自由に入手できるドキュメントへの参照、またはこの問題のアルゴリズム自体に大いに感謝します。

1
編集距離計算のためのマイクロ最適化:それは有効ですか?
上ウィキペディア、編集距離のためのボトムアップの動的プログラミングスキームの実装が与えられています。それは完全に定義に従っていません。内部セルはこうして計算されます: if s[i] = t[j] then d[i, j] := d[i-1, j-1] // no operation required else d[i, j] := minimum ( d[i-1, j] + 1, // a deletion d[i, j-1] + 1, // an insertion d[i-1, j-1] + 1 // a substitution ) } ご覧のとおり、一致がある場合、アルゴリズムは常に左上隣から値を選択し、一部のメモリアクセス、ALU操作、および比較を保存します。 ただし、削除(または挿入)の結果、値が小さくなる可能性があるため、アルゴリズムはローカルで正しくありません。つまり、最適性の基準に違反しています。しかし、おそらく間違いは最終結果を変えない-それはキャンセルされるかもしれない。 このマイクロ最適化は有効ですか、そしてなぜ(そうではない)のでしょうか?

1
特定の文字列が文字列のコレクションとどの程度類似しているかを判断する
この質問がここにあるかどうかはわかりませんが、そうでない場合はお詫びします。私がやろうとしていることは、与えられた文字列が文字列のバッグに「属する」かどうかを確率論的に決定できるプログラム的な方法を開発することです。たとえば、10,000の米国の都市名のバッグがあり、「フィラデルフィア」という文字列がある場合、「フィラデルフィア」がすでに知っている米国の都市名に基づいて、米国の都市名である可能性を定量的に測定したいと思います。このコンテキストでは、実際の都市名と偽の都市名を区別できないことはわかっていますが、少なくとも、「123.75」や「速い赤狐が怠惰な茶色の犬を飛び越えた」などの文字列は除外されます。いくつかのしきい値。 開始するには、レーベンシュタイン距離を見て、それが少なくとも私が解決しようとしている問題と多少似ている問題にどのように適用されるかについて少し考えました。私が見つけた興味深いアプリケーションの1つは、盗作の検出でした。1つの論文では、変更されたSmith-WatermanアルゴリズムでLevenshtein距離がどのように使用され、特定のベースペーパーの盗聴されたバージョンである可能性に基づいて論文をスコア付けしました。私の質問は、誰かが私を助けるかもしれない他の確立されたアルゴリズムまたは方法論で私を正しい方向に向けることができるかどうかです。これは過去の誰かが解決しようとした問題かもしれないという感じがしますが、これまでのところ、Google-fuは失敗しました。

1
任意の順列を一連の(挿入、移動、削除)操作として表現する
2つの文字列があるとします。それらをおよびBと呼びます。どちらの文字列にも繰り返し文字はありません。AAABBB をBに変換する挿入、移動、削除操作の最短のシーケンスを見つけるにはどうすればよいですか?AAABBB insert(char, offset)文字列charの指定さoffsetれた位置に挿入します move(from_offset, to_offset)現在オフセットfrom_offsetにある文字を新しい位置に移動して、オフセットを設定しますto_offset delete(offset) の文字を削除します offset アプリケーション例:データベースクエリを実行し、結果をWebサイトに表示します。その後、データベースクエリを再実行し、結果が変更されたことを発見しました。最小数のDOM操作を使用して、現在データベースにあるものと一致するようにページの内容を変更したいとします。最短の操作シーケンスが必要な理由は2つあります。まず、効率。変更されるレコードが数個しかない場合は、O(n )ではなくを実行する必要があります。O(1)O(1)\mathcal{O}(1)O(n)O(n)\mathcal{O}(n)DOM操作。高価なため。第二に、正しさ。アイテムをある位置から別の位置に移動した場合、関連付けられたDOMノードを破棄して再作成せずに、1回の操作で移動する必要があります。そうしないと、フォーカス状態、<input>要素のコンテンツなどが失われます。

1
連続ハッシュはありますか?
質問: そのジャムの情報トポロジー(暗号学的に安全な)ハッシュが存在することができる?{0,1}∗{0,1}∗\{0,1\}^{*} 私たちは、与えられた効率的に計算可能な近さ述語追加できると時間K(Y )(またはY自体を)あれば教えてくれるyがある非常に近いX(例えばレーベンシュタイン距離またはのハミング距離のxとyの未満であります固定定数c)?hk(x)hk(x)h_k(x)hk(y)hk(y)h_k(y)yyyyyyxxxxxxyyyccc バックグラウンド: 情報トポロジによって Iはポイントとトポロジー空間を意味上Σ *と塩基と{ X Σ *:X ∈ Σ * }。Σ∗Σ∗\Sigma^*Σ∗Σ∗\Sigma^*{xΣ∗:x∈Σ∗}{xΣ∗:x∈Σ∗}\{x\Sigma^* : x \in \Sigma^* \} トポロジについて考える良い方法は、オープンセットを肯定 / 検証可能なポイントのプロパティと見なすことです(つまり、trueの場合、trueであることを確認/観察できます)。これを念頭に置いて、クローズドセットは反駁可能なプロパティです。 関数は、開集合の逆画像が開いている場合は連続です。我々の場合、この手段は、その全てについてのy ∈ Σ *、あるI ⊆ Σ *ように F - 1(Y 、Σ *)= ⋃ X ∈ I X Σ *。f:Σ∗→Σ∗f:Σ∗→Σ∗f:\Sigma^* \to \Sigma^*y∈Σ∗y∈Σ∗y \in \Sigma^*I⊆Σ∗I⊆Σ∗I \subseteq \Sigma^*f−1(yΣ∗)=⋃x∈IxΣ∗.f−1(yΣ∗)=⋃x∈IxΣ∗.f^{-1}(y\Sigma^*) = \bigcup_{x\in …

2
順列のハミング距離の代替
私は2つの文字列を持っていますが、一方は他方の順列です。必要な置換の最小数を見つける代わりに、文字列aから文字列bに移動するのに必要な最小数の転座を見つけるハミング距離の代替案があるかどうか疑問に思いました。 私の文字列は常に同じサイズで、エラーや置換がないことを知っています。 例: 1 2 3 4 5 3 2 5 4 1 これは私に2つを与えるでしょう: 3 2 5 4 1 (start) -> 3 2 1 4 5 -> -> 1 2 3 4 5 これがすでにRに実装されている場合は、さらに良いでしょう。

1
レベンシュタイン距離と動的タイムワープ
ワグナー・フィッシャーアルゴリズムとdtwアルゴの間をどのように平行に描くかわかりません。どちらの場合も、各インデックスの組み合わせ(i、j)の距離を求めます。 ワーグナーフィッシャーでは、空の文字列から別の文字列への挿入回数によって距離を開始します。 let wagnerFischer (s: string) (t: string) = let m, n = s.Length, t.Length let d = Array2D.create (m + 1) (n + 1) 0 for i = 0 to m do d.[i, 0] <- i for j = 0 to n do d.[0, j] <- j for j …

2
文字列のセットに近い文字列はいくつありますか?
この質問は、高速なスペルチェッカーを構築するための効率的なデータ構造によって促されました。 2つの文字列が与えられた u,vu,vu,v、私たちは彼らがそうだと言います kkk-それらのダメラウ–レヴェンシュタイン距離 ¹が小さい場合、つまりLD(u,v)≥kLD⁡(u,v)≥k\operatorname{LD}(u,v) \geq k 固定の k∈Nk∈Nk \in \mathbb{N}。非公式に、LD(u,v)LD⁡(u,v)\operatorname{LD}(u,v) 変換に必要な削除、挿入、置換、および(隣接)スワップ操作の最小数です uuu に vvv。それはで計算することができますΘ(|u|⋅|v|)Θ(|u|⋅|v|)\Theta(|u|\cdot|v|)動的プログラミングによる。ご了承くださいLDLD\operatorname{LD}はメトリックであり、特に対称的です。 関心のある問題は次のとおりです。 セットを考える SSS の nnn ひも ΣΣ\Sigma 長さが最大 mmm、のカーディナリティは何ですか Sk:={w∈Σ∗∣∃v∈S. LD(v,w)≤k}Sk:={w∈Σ∗∣∃v∈S. LD⁡(v,w)≤k}\qquad \displaystyle S_k := \{ w \in \Sigma^* \mid \exists v \in S.\ \operatorname{LD}(v,w) \leq k \}? 同じ長さの2つの弦でも数が異なるため kkk-closestrings²一般的な式/アプローチは見つけるのが難しい(不可能?)場合があります。したがって、所定の数ごとに明示的に数を計算する必要があるかもしれませんSSS、主な質問に私たちを導きます: セットのカーディナリティを見つけることの(時間)複雑さは何ですか {w}k{w}k\{w\}_k (任意) w∈Σ∗w∈Σ∗w \in …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.