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

1
ラビン・カープvsカープ・ラビン
Wikipediaの賢明な他の編集者は、Rabin-Karpの名前がより頻繁に使用されることに基づいて、Rabin-Karp アルゴリズムに関するWikipediaの記事を、Karp-Rabinアルゴリズムと呼ぶべきものに移動するという私の要求を拒否しました(偽、Googleの学者の数で言えば)、または大声で聞こえる(本当に?)元の出版物の名前の順序はKarpとRabinで、通常は理論論文用であるため、アルファベット順で、それが私が移動を要求した理由です。 Rabin–Karpの名前の順序付けの1つの主要な提案者は、Cormen–Leiserson–Rivest–Stein Introduction to Algorithms教科書です。ウィキペディアの結果は、重要な新しい証拠がない限り何らかの形で変わる可能性は低く、RabinまたはKarpがクレジットを重視する可能性は低いようですが、今、私は興味があります:読者はこの歴史を覚えており、 CLRS(または他の誰か)がRabin–Karpの名前順を選択した理由の説明ϵϵ\epsilon

8
レーベンシュタイン距離をすばやく計算する
許可された単語(アルファベット順)と単語の巨大なデータベースが与えられた場合、レーベンシュタイン距離に関して与えられた単語に最も近いデータベースから単語を見つけます。 単純なアプローチは、もちろん、指定された単語と辞書内のすべての単語間のレベンシュタイン距離を単純に計算することです(実際に距離を計算する前にデータベースでバイナリ検索を実行できます)。 この問題に対するより効率的な解決策があるのだろうか。おそらく、検索する単語の数を減らすヒューリスティック、またはレベンシュタイン距離アルゴリズムの最適化が可能です。 このテーマに関する論文へのリンクは歓迎です。

2
n次元パターンマッチング
n次元配列内の正確なn次元部分配列を見つけるための既知の結果は何ですか? 1Dでは、これは単なる文字列マッチングの問題であり、KMPは線形時間でそれを行います。 この論文では、2Dで、余分なスペースをほとんど必要とせずに線形時間で実行できることを示しました。 この問題は、固定次元の線形時間最悪ケースで解決できますか?

2
移動操作で距離を編集する
動機:共著者が原稿を編集し、編集の概要を明確に見たい。ツール様全ての「差分」は、あなたがしている場合は無用になる傾向があり、両方の周りにテキストを移動する(例えば、再組織化構造)とローカル編集を行います。それを正しくするのは本当に難しいですか? 定義:許可される操作は次のとおりです。最小編集距離を見つけたいです。 「安い」操作:単一の文字の追加/変更/削除(通常のレーベンシュタイン操作)、 "高価な":操作:新しい場所(にサブストリングを移動bはCのD ↦ のC BのD任意の文字列の、B、C、D)。abcd↦acbdabcd↦acbdabcd \mapsto acbdaaabbbcccddd 2つの文字列とyおよび整数kとKが与えられた場合、次の問題を解決したいと思います。xxxyyykkkKKK あなたは、変換することができますにyのほとんどで使用してk個の安価な操作と最大でK高価な操作?xxxyyykkkKKK 質問: この問題には名前がありますか?(配列アラインメントの文脈では非常に標準的な質問のように聞こえます。) 難しい? 難しい場合、をパラメーターとして扱いやすい固定パラメーターですか?KKK 効率的な近似アルゴリズムはありますか?(例えば、最大で有する溶液見つける安価及び2 Kを有する溶液場合、高価な操作をk個の安価及びK高価な操作が存在します。)2k2k2k2K2K2KkkkKKK Wikipediaにリストされている文字列メトリックを見てみましたが、どれも正しく見えませんでした。

1
パリンドロームによるストリングのカバー
w = σ1σ2… σnw=σ1σ2…σnw=\sigma_1\sigma_2\ldots\sigma_np1p2⋯ pmp1p2⋯pmp_1p_2\cdots p_mのp私p私p_ip1p2⋯ pm= wp1p2⋯pm=wp_1p_2\cdots p_m = wp私p私p_i パリンドロームの最小サイズのカバーを見つけるのはどれくらい難しいですか?(これは動的プログラミングで実行可能と思われますが、動作するかどうかはわかりません)。 bbb 単純な欲張りアルゴリズムを考えてみましょう。これは、常に現在の位置から始まる最長の回文を取ります。たとえば、場合w = 1213312w=1213312w=1213312(121 )⋅ (33 )⋅ (1 )⋅ (2 )(121)⋅(33)⋅(1)⋅(2)(121)\cdot(33)\cdot(1)\cdot(2)、最適なカバーは (1 )⋅ (213312 )(1)⋅(213312)(1)\cdot(213312)。 貪欲なアルゴリズムは問題の2近似を提供しますか?

1
フィボナッチ語
古いチェコのアルゴリズムの教科書で次の問題に出会いましたが、悲しいことにヒントも解決策もありませんでした。 ように「我々はフィボナッチ列を定義、、、及び、一般的な文字であるが。どの所与のに文字列(潜在的に大きなアルファベットの上に)線形時間で最長のフィボナッチのサブワードを見つけることができますか?」F 1 = b F n + 2 = F n F n + 1 a bF0= aF0=aF_{0}=aF1= bF1=bF_{1}=bFn + 2= FnFn + 1Fn+2=FnFn+1F_{n+2}=F_{n}F_{n+1}aaabbb 私は二次時間で解決策を知っていますが、それを線形に減らすことはできません。誰かが私を正しい方向に向けることができますか?

2
文字列の均質化の複雑さ
動機:データのバージョン管理用のツールを開発しているときに、2つの整数のセットを "比較"するアルゴリズムを検討しました。この問題を、距離の編集、スワッピングによるグループ化、最小の共通文字列パーティションへの接続があると思われる次の非常に自然な問題に減らすことができました。 問題:文字列、つまり一連の文字が与えられ、最小のコストでそれを均質化することが目標です 。つまり、類似するすべての文字が互いに隣り合うように並べ替えられたシーケンスが必要です。 許可される唯一の操作は、類似した文字のサブシーケンスを取得し、そのサブシーケンスをどこにでも移動することです。これには1ユニットかかります。 この問題の複雑さを特徴付ける助けがあれば大歓迎です! 例: aabcdab:入力 bcd aa ab:最初のaaを「d」の直後の位置に移動した後 b bcdaaa:末尾のbを最初の位置に移動した後 結果の文字列は均一であるため、コストは2になります。 出力に関しては何の制約も受けないことに注意してください。均質である限り、特定の順序を保証する必要はありません。

4
サフィックスツリーを使用して、すべての一般的な部分文字列を検索できますか?
文字列シーケンスを比較するためにサフィックスツリーを使用しようとしています。サフィックスツリーを使用した最も長い共通のサブ文字列問題の実装/理論を見つけました。ただし、私が探しているのは、関連する問題-「すべての一般的な部分文字列」の説明です。具体的には、最初に最も長い共通部分文字列を見つけ、次にすでに見つかったlcsインデックスを含まない次の最も長い共通部分文字列を見つける必要があるという問題があります。この問題は、2つのシーケンスに対して一度だけ一般化サフィックスツリー(GST)を構築することで解決できますか?LCSの検索と削除を繰り返すたびにGSTを繰り返し作成することで解決できることはわかっています。しかし、GSTで一度だけ構築される巧妙なトリックが欠けているのではないかと思います。

3
文字列の置換パターンマッチング
大まかに言えば、順列パターンマッチングは次の種類の問題を扱います。 所与の順列は、にS 、N及びσにSのMとM ≤ N、んπを含むサブシーケンスτ長のM要素に従って順序付けられるσを?ππ\piSnSnS_nσσ\sigmaSmSmS_mm≤nm≤nm\leq nππ\pi ττ\taummmσσ\sigma 例えば、とσ = ⟨ 2 1 3 ⟩、次いで、サブ3つの1 4マッチはσ。ご覧のとおり、ここでは完全一致ではなく、指定されたパターンに「似ている」ものを探しています。π=⟨3 1 5 4 2 8 6 7⟩π=⟨3 1 5 4 2 8 6 7⟩\pi=\langle 3\ 1\ 5\ 4\ 2\ 8\ 6\ 7\rangleσ=⟨2 1 3⟩σ=⟨2 1 3⟩\sigma=\langle 2\ 1\ 3\rangle3 1 43 1 43\ 1\ 4σσ\sigma …

1
ドントケアとのパターンマッチング:複数のパターン
Kalaiの2ページのSODAペーパーは、ドントケア(1文字に一致するワイルドカード)を使用したパターンマッチングのためのシンプルで効率的なアルゴリズムを提供します。本質的には、畳み込みと同じくらい簡単です。 しかし、ドントケアで複数のパターンを検索している場合はどうなりますか?それでも、たとえばFFTベースの手法でなんとかしてそれを解決できますか?

1
ワイルドカード文字列がセット内の別のワイルドカード文字列と完全に一致するかどうかの判断
ここに私をしばらく悩ませてきた問題があります。さんが言ってみましょう文字列は、1と0のシーケンスであり、そしてワイルドカード文字列は 1のシーケンスであり、0、および?の。すべての文字列とワイルドカード文字列は同じ長さです。これらは標準のUNIXワイルドカードです。10 ?? 1は10011、10111などと一致します。その位置で1または0に一致します。場合はおよびWは、ワイルドカード文字列である、我々は書きV ≤ Wにマッチしたすべての文字列ならばvはまたで一致しているワットを。vvvwwwv≤wv≤wv \leq wvvvwww 問題:集合与えられたワイルドカード文字列の、およびクエリV(ワイルドカード文字列)は、存在しないwが∈ SようにV ≤ ワット?そうでない場合、vをSに効率的に追加できますか?SSSvvvw∈Sw∈Sw \in Sv≤wv≤wv \leq wvvvSSS ここに明らかなソリューション(kは文字列のサイズ、mはRAMのワードサイズ(通常32または64)):リストの各要素を調べ、条件をテストします(2または3回の操作で実行できます)ビットいじりを使用して)。また、テストであれば、V≥wは任意の項目について成り立つワットながら、僕らだスキャン。vがテストに失敗した場合は、vをセットに追加し、マークしたwを削除します。O(kmn)O(kmn)O(\frac{k}{m}n)kkkmmmv≥wv≥wv \geq wwwwvvvvvvwww しかし、それは十分に速くありません。ソリューション、または完全な世界では、基数ツリー(O (k ))に似た複雑さがあったら、それは本当にすばらしいでしょう。クエリはほぼ正確であることがもOKです:場合、であるV ≤ wが、その後、yesまたはno返しません。しかし、条件が成立しない場合は、間違いなくノーを返します。O(logn)O(log⁡n)O(\log n)O(k)O(k)O(k)v≤wv≤wv \leq w これは最悪の場合の複雑さには役立ちませんが、内のすべての要素はワイルドカード文字列で区切られていると想定できます。つまり、いくつか存在するVなど、すべてのそれのw ∈ S、V ≥ wは。SSSvvvw∈Sw∈Sw \in Sv≥wv≥wv \geq w 私が試したアイデア ワイルドカード文字列は結合セミラティスを形成します。ワイルドカード文字列を保持するn-aryツリーを持つことができます。葉はワイルドカード文字列であり、枝はすべての子の結合を表します。クエリと結合が比較できない場合、そのブランチのすべての子と比較するために時間を無駄にする必要はありません。さらに、更新を行い、その更新が結合よりも大きい場合は、ブランチ全体を削除するだけで済みます。残念ながら、これは最悪の場合でも依然としてであり、要素を追加するためにツリーをスキャンするときに、常に「最適な」結合を見つけることができるとは限りません。O(n)O(n)O(n) 基数トライを形成できます。Sはいくつかのワイルドカード文字列で区切られていることがわかります。?0?0であると仮定します。次に、トライのすべてのブランチは、文字列の1番目と3番目のビットにある必要があります。クエリで分岐している現在のビットが1の場合、?そして1つの枝; 0の場合、?そして0の枝; ?の場合、チェックするのは?ブランチ。潜在的に複数のブランチをとる必要があるため、これはあまりよくありません(同じ理由でトライを更新するのは困難です)。マッチングは非常に高速な操作であるため、ツリー内で多くのトラバースを実行する単純な戦略と比較すると、害があります(ポインターの束を追跡することは、いくつかのORやANDを実行するよりもはるかにコストがかかります)。SSSSSS 関連作業 ネットワーキングコミュニティでは、この問題は「パケット分類」として現れます。ここでは、既知のアルゴリズムとデータ構造の良い調査を示します。残念ながら、ほとんどの場合、ワイルドカード文字列はプレフィックスにのみ一致すると想定されており、クエリはそのような文字列のタプルです。もちろん、常に次の基準を満たすように一般的なワイルドカード文字列を変換できます:1?00?1 ?? は(1、?、0、0、?、1、?、?)です。ただし、これは効率的ではありません。他の前提として、これらのタプルは「色」に関連付けられており、クエリで色が返される必要があります(一致した色だけではありません)。これは、タプルを順序付けする必要があるため(または(0、?)と(?、1)のどちらが(0、1)に一致するかが不明確)、問題がはるかに困難になります。 アルゴリズムコミュニティでは、「気にしない」と一致する部分文字列の検索に関連する多くの結果を見つけました。これはかなり難しい問題であり、実際にはどのテクニックも利用できません。 結論として 助けてくれてありがとう!

4
レーベンシュタイン距離の中間/コーディング表現
フレーズ: 素早い茶色のキツネが怠惰な犬を飛び越えます[A] そして Uickブラウンフォックスが怠惰な犬をジャンプします[B] AをBに変換するために必要な単一文字の追加、削除、または置換の最小数を計算することにより、Levenshtein Distanceアルゴリズムを使用して類似性を判断することで比較できます。 中間表現、またはおそらくレーベンシュタイン距離のコーディングスキームがあるかどうかを知りたいです。2つのフレーズ間で使用するのではなく、文字インデックスが比較に影響を与えないように、単一のフレーズに適用されるコーディングのみ。 Bでは、Aと比較して 'q'が欠落しています。通常の文字列比較は、単一の文字オフセットのために、一致'The 'して失敗し'uick brown fox...'ます。レーベンシュタイン距離を使用して、より寛容な比較のために元のフレーズAと比較できますが、私の場合、2つのフレーズはなく、1つだけです。 だから、私は情報のパケットで文を明確にコーディングするいくつかの方法を探しています、ローカルの順序などを維持する小さな真実のアトム(文字ごとに1つのパケットを考えているのですか?)間違っています。それ以降の文字には影響しません。 一意のフレーズはそれぞれ、唯一の一意のエンコード/中間表現であるSet A'とにマップする必要がありB'ます。AとBのレーベンシュタイン距離の計算は、セットの共通部分の計算と同じになりますA' = B'。 あるいは、この問題に解決策がない場合(そしてこれが確かに研究の盛んな領域にマップされている場合、私は驚かないでしょう)、その解決できないことについての説得力のある議論/証拠です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.