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

2
共通部分列
文字列には2n2n2^nサブシーケンスがありますが、通常はすべてが異なるわけではありません。サブシーケンスの最大頻度を見つけることの複雑さは何ですか? たとえば、文字列「subsequence」にはサブシーケンス「sue」のコピーが7つ含まれており、これが最大です。 http://ideone.com/UIp3tのブルートフォースコードのサンプル 関連する構造定理はありますか?これらは両方とも偽であることが判明しました。 最大頻度サブシーケンスの最長は一意です 任意の長さ-の最大周波数kkkサブシーケンスは単峰性であるkkk おそらく関連するリンク: #明確なサブ配列を数える∈P∈P\in \mathbf{P} http://11011110.livejournal.com/254164.html 複数のソースの関連コンテストの問題http://www.spoj.pl/problems/CSUBSEQS/ 関連論文http://dx.doi.org/10.1016/j.tcs.2008.08.035 10日後に編集:ご覧いただきありがとうございます!これにより、多項式時間で解けるプログラミングコンテストの問題が発生するのではないかと考えていました。私はそうは思いませんが、後でもう一度考えたいと思います。

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

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
木のコレクションを検索するための効率的なアルゴリズム
大きな木のデータセットがあり、ツリーレット(接続されたサブグラフ)を指定して検索したいのですが。クエリは、データセット内のツリーレットのすべての出現を返す必要があります。 そうするための効率的なアルゴリズムはありますか? 接尾辞配列のようなものを考えていましたが、ツリーの単純な文字列としてのエンコード(ノードの固定のトラバース順序による)は機能しません。検索ツリーレットは任意の形状にすることができるためです。 更新: 私が期待する典型的なインスタンスに関するいくつかの詳細: データセットは、それぞれが約20〜30のノードで構成される、少なくとも数万の木で構成されます。ツリーはバイナリではありませんが、ノードあたりの一般的な子の数は少なくなります(通常は4または5以下ですが、場合によっては約30に達することもあります)。ラベルの数は数万になります。 NLPアプリケーションではこれが必要です。各ツリーは文の依存解析であり、各ノードは単語の出現を表し、各ノードは辞書の単語にラベルを付けます(装飾が施されています)。

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)に一致するかが不明確)、問題がはるかに困難になります。 アルゴリズムコミュニティでは、「気にしない」と一致する部分文字列の検索に関連する多くの結果を見つけました。これはかなり難しい問題であり、実際にはどのテクニックも利用できません。 結論として 助けてくれてありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.