タグ付けされた質問 「strings」

シンボルのシーケンス、そのセットとそのプロパティ、および使用法に関する質問。

1
最長の繰り返しサブシーケンスを見つける
文字列与えられた場合、最も長い繰り返し(少なくとも2回)のサブシーケンスを見つけたいと思います。つまり、私は、文字列検索したいwののサブシーケンスである(連続している必要はありません)のように、W = ワット" ⋅ ワットを"。つまり、wは半分が連続して2回現れる文字列です。wはsのサブシーケンスですが、必ずしもサブストリングではないことに注意してください。ssswwwsssw=w′⋅w′w=w′⋅w′w=w' \cdot w' wwwwwwsss 例: 「ababccabdc」の場合は「abcabc」になります。これは、「ababccabdc」に「abc」=「abc」と「abc」が(少なくとも)2回表示されるためです。 「addbacddabcd」の場合、「dd」は2回表示されるため、1つのオプションは「dddd」です(同じ文字を複数回使用することはできませんが、ここでは4つの「d」があるので問題ありません)。ただし、lebngth 4です。長さ8の場合: 'abcdabcd'は、 'abcd'が 'addbacddabcd'のサブストリングであるため、2回出現します。 最長の繰り返しサブシーケンスを見つけることに興味があります。これは「最長/最大の正方形を見つける」とも呼ばれますが、正方形が部分列ではなく部分列に対して定義されている多くの記事を読みました。 文字列のブレークポイントのすべてのオプションを反復することでを取るブルートフォースアルゴリズムを簡単に使用できます。次に、最大/最長の共通サブシーケンスを検索する2つの文字列を作成しますが、各チェックは動的プログラミング手法を使用してO (n 2)を取るため、全体の時間はO (n 3)になります。私はO (n 2をとる最も長い共通部分列のためのより効率的なアルゴリズムを見つけましたO(n3)O(n3)O(n^3)O(n2)O(n2)O(n^2)O(n3)O(n3)O(n^3)なので、実行時間はO(n3O(n2logn)O(n2log⁡n)O(\frac{n^2}{\log n})。O(n3logn)O(n3log⁡n)O(\frac{n^3}{\log n}) 私は最長の繰り返しサブシーケンス問題のためのより効率的なアルゴリズムを探しています。おそらく、すべてのブレークポイントを反復するという私の考えは、時間を浪費しすぎて、反復回数を減らすことができます。あるいは、異なる姿勢のアルゴリズムがこの問題を解決できるかもしれません。 私は多くのジャーナルや以前の質問で検索してきましたが、私が見つけた結果のほとんどは部分列ではなく部分文字列に関するものでした。 これはサフィックスツリーを使用して実行できることも読みましたが、これもサブストリングに関連しており、そのようなアイデアをサブシーケンスに拡張できるかどうかはわかりません。 時間で実行されるソリューションを探しています。時間の1が存在する場合にはO (nは⋅ ログn個)でも良くなる(そのようなものが存在する場合、私はわかりません)。O(n2)O(n2)O(n^2)O(n⋅logn)O(n⋅log⁡n)O(n \cdot \log n)

1
n個の文字列が与えられた場合、それらの1つは別の部分文字列ですか?
nnn文字列のコレクションが与えられたとしますS1,…,SnS1,…,SnS_1,\dots,S_n。これらの文字列のいずれかがコレクション内の他の文字列の部分文字列であるかどうかを知りたいのですが。つまり、次のタスクのアルゴリズムが必要です。 入力:S1,…,SnS1,…,SnS_1,\dots,S_n 出力:i,ji,ji,jようなSiSiS_iの部分文字列であるSjSjS_jとi≠ji≠ji\ne j、またはNoneがない場合は、このようなi,ji,ji,jが存在 これのための効率的なアルゴリズムはありますか? 「部分文字列」を「接頭辞」で置き換える場合、効率的なアルゴリズムがあります(文字列を並べ替えてから、線形スキャンを実行して隣接する文字列を比較します。並べ替えにより、部分文字列が確実に隣接します)。しかし、文字列が他の文字列の部分文字列であるかどうかをテストすることは、より困難に思えます。単純なアルゴリズムは、すべてのペアを反復処理することですが、これにはΘ (n 2)サブストリングテストが必要です。より効率的なアルゴリズムはありますか?i,ji,ji,jΘ(n2)Θ(n2)\Theta(n^2) これを「すべてのペアの部分文字列テスト」などと呼ぶことができると思います。 私の最終的な目標は、コレクション内の何かの部分文字列である各文字列を削除することにより、コレクションをプルーニングして文字列が他の文字列の部分文字列にならないようにすることです。

1
文字列内で最も長く繰り返されるパターンを見つける
文字列で最も長く繰り返されるパターンを見つけるための効率的なアルゴリズムを探しています。 たとえば、次の数字の文字列を考えてみます。 5431428571428571428571428571427623874534。 ご覧のとおり、142857142857はこの文字列で数回(少なくとも2回)繰り返される最も長いパターンです。 繰り返される文字列には、総当たりではなく、どんなアイデアも含めるべきではありませんか?

1
現代の正規表現の表現力
私は最近、主に単語のグループを特別なプロパティと照合する正規表現の課題を提案するWebサイトについて友人と話し合いました。彼は||||||||、数|が素数であるような文字列に一致する正規表現を探していました。そのような言語は、通常であれば、補題をポンプの翻訳が素数のためにあるという事実与えますので、私はすぐにそれが今まで動作しません彼に言われた十分な大きさ、それが存在するのk ≤ pがあるようP + N kは、すべての主要ですN ≥ - 1、よく、これは全くケースしにくい(素数の配分、そのような未知の自明とプロパティを破砕、...)pppk≤pk≤pk \leq pp+nkp+nkp + nkn≥−1n≥−1n \geq -1 しかし、誰かが解決策に付属している:一致しない(||+?)\1+ キャプチャグループに一致するように、この表現しようとする(つまりすることができ||、|||、||||などの上の出現箇所)のn ≥ 2回。一致する場合、文字列で表される数はkで割り切れるので、素数ではありません。それ以外の場合です。k≥2k≥2k \geq 2|n≥2n≥2n \geq 2kkk そして、グループ化と後方参照により、正規表現が理論的な意味で...正規表現よりも実際にはるかに表現力豊かになることが明らかになったので、私は愚かに感じました。今では、実際の正規表現を実行するときに私が知らなかったルックアラウンドやその他の演算子も追加されました。 ウィキペディアによると、文脈自由文法によって生成された言語よりもさらに表現力があります。だからここに私の質問があります: 現代の正規表現エンジンを使用して、(文脈自由文法から生成された)代数言語を表現できますか より一般的な説明、または現代の正規表現で説明できる言語の種類の複雑さの少なくとも上限はありますか? より実用的には、その背後に深刻な理論がありますか、それとも有限オートマトンに基づく実際の正規表現の最初のブロックに実装可能と思われるたびに新しい機能を追加するだけですか? 「モダンな正規表現」は質問が具体的ではないことを知っていますが、少なくとも後方参照を使用することを意味します。もちろん、この「現代の正規表現」言語に対する特定の制限を想定している部分的な回答者がいる場合は、遠慮なく投稿してください。

3
文字列が回文の連結であるかどうかをチェックするアルゴリズムはありますか?
文字のシーケンスが回文の連結であることを確認する線形時間アルゴリズムはありますか?私の頭に浮かぶのは、単純な解決策だけです。 1. k = 1 2. Split string into k substrings (all possibilities) and check 3. k++ 4. repeat 注:長さ1の文字列が回文であると定義されている場合、答えは自明です。これはそうではないと仮定しましょう。

2
類似しているが順序が異なるコンテンツを持つ2つの大きなテキストコーパスの違いを見つけるための効率的な方法は何ですか?
英語のテキストの段落を含む2つの大きなファイルがあります。 最初のテキストは約200ページの長さで、ページあたり約10段落(各段落は5文長)です。 2番目のテキストには、最初のテキストとほぼ同じ段落とテキストが含まれています。また、ページ数は200ページで、1ページに10段落あります。ただし、最初のテキストと比較すると、段落はランダム化され、順序が異なります。また、大部分の段落では、類似の段落と比較して、表現にわずかな変更があります。たとえば、最初のテキストの段落には次のようなLike Jimmy, I wanted to go to the palace文があり、2番目のテキストの段落の対応する文にはがありますLike Jimmy, I really wanted to go to the castle。 私は、追加のような、ここで変更を取得できるようにしたいreallyとの削除palaceが置換されましたcastle。段落がおおまかに揃っている場合、テキストを比較する方法はたくさんあるので、これはかなり簡単です。ただし、段落が揃っていないため、そうではありません。 ファイルが小さい場合(数段落)、レーベンシュタイン距離はおそらくうまく機能しますが、ファイルが大きいため、テキスト1の各段落をテキスト2の各段落と比較して、一致する段落を見つけるのは非効率的です。 この問題を効率的に処理するには、他にどのようなアプローチがありますか?


1
繰り返しのない文字列の数の式は何ですか?
文字列の数を数えたい sss 有限のアルファベット以上 AAA、それは繰り返しを含まず、それによって私は任意の部分文字列を意味します ttt の sss、 1&lt;|t|&lt;|s|1&lt;|t|&lt;|s|1< |t| < |s|、のばらばらのコピーはありません ttt に sss。例として、A={a,b}A={a,b}A=\{a,b\}。その後aaaaaaaaa ある部分文字列のため以来、私はカウントしたい文字列のいずれかaaaaaa、ばらばらのコピーはありません。しかしながら、abababababab そのような繰り返しが含まれています。 誰かがすでに有用な式を見つけている場合は、リンクしてください。それ以外の場合は、誰かの回答を使用する場合、私が書く記事でこの投稿を参照します。 別の例を示します。長い文字列を作成してみましょう{a,b}{a,b}\{a,b\}、繰り返しを含まない: aaa(aにすることはできません) aaab(aまたはb) aaabbb(bに することはできません) aaabbba(bまたはaにする ことはできません)aaaba(aまたはbにすることはできません) ツリーを構築した場合、ノードの数を数えることができますが、式が必要です。 編集: まあ、私たちがこれをビンを選択する問題に変換するかどうか最初に考えたほど難しくはありません。少なくとも1回の繰り返しを持つ長さkの文字列のセットは、デカルト積のすべての順列の和集合であるセットに等しくなります。 A×A×⋯×A(k-4 times)×R×RA×A×⋯×A(k-4 times)×R×RA \times A \times \cdots\times A \text{(k-4 times)} \times R \times R どこ RRR必要な繰り返しです。それが役に立ったかどうかはわかりませんが、プロのように聞こえます:)とにかく、| A |にしましょう ビン、繰り返しになる任意の2つ(同じものであっても)を選択し、次にk−4k−4k-4もっと増やして掛けます(最初の4つはすでに選択されています、参照してください?)。今、私は離散数学からその式を見つける必要があります。

2
ソートされた文字列の辞書式順序で文字列のリストをソートする
LETアルファベット上の文字列の集合で合計に含まれていることをのシンボル。あAA{ 0 、… 、m − 1 }{0,…,m−1}\{0,\ldots,m-1\}んnn あなたの仕事は、各文字列を内部的にソートし、結果の文字列を辞書式順序でソートすることです。(アルゴリズムはこのように動作する必要はありません。) 例: 入力:33123 15 1 0 54215 21 12 出力:0 1 12 12 12333 12455 15 時間と空間でそれを行う方法を見つけました。O (m + n )O(m+n)O(m+n)O (m n )O(mn)O(mn) サイズ配列を作成し、すべてのセルに初期値を与えるような配列を使用しているため、スペースは時間よりも大きくなっています。んnnO (1 )O(1)O(1) 各文字列(時間とスペース)をソートするためにバケットソートを使用し、コレクション自体(時間とスペース)をソートするためにワードツリーを使用しました。しかし、私の解決策は複雑すぎます。O (m + n )O(m+n)O(m+n)あAAO (m + n )O(m+n)O(m+n)O (m n )O(mn)O(mn) 時間とより少ないスペース、またはより速い、より良いソリューションがありますか?O (m + n …

1
Rabin-Karpは本当にローリングハッシュにmod Q操作を適用することに注意する必要がありますか?
私はRabin Karpアルゴリズムについて読んでいて、値Qによって制限されたローリングハッシュ値を維持することの大事なことは何だろうとずっと思い続けました。 一般的なコンピューターでの整数表現は2の補数であるため、実際には、ローリングハッシュに対するすべての操作を2 ^ 31で制限するのとまったく同じであると考えました。つまり、気にしないでください。さらに、バインドまたはハッシュする値が小さいほど、衝突が増えるため、Qが大きいほどパフォーマンスが向上します。 簡単な(Java)実装をコーディングしてみました。 public static int rabinKarp(String text, String pattern) { if (text.length() &lt; pattern.length()) { return -1; } else { int patternHash = 0; int textHash = 0; int pow = 1; // preprocessing the pattern and the first characters of the text string for (int …

1
Rabin–Karpでハッシュを計算するために使用される基底が常に素数であるのはなぜですか?
Rabin–Karp文字列照合アルゴリズムには、迅速に計算できるハッシュ関数が必要です。一般的な選択は h(x0…xn)=∑i=0nbixi,h(x0…xn)=∑i=0nbixi, h(x_0\ldots x_n) = \sum_{i=0}^n b^i x_i, どこ bbbあるプライム(すべての計算は、モジュールです2w2w2^w、 どこ wwwマシンワードの幅です)。なぜそれが重要なのかbbb プライムになるには?

6
C ++文字列と文字配列
大学レベルのコンピューターサイエンスを教えるほとんどのC ++インストラクターが、文字列をテキストに使用することを思いとどまらせたり、禁止したりするのではなく、学生に文字配列の使用を要求するのはなぜだと思いますか? 私はこの方法論が何らかのプログラミング習慣を教えることを意図していると想定していますが、私の経験では、文字列の使用だけで何も問題はなく、使用と学習が非常に簡単です。


1
1つのストリングのサブシーケンスで他のストリングのサブシーケンスではない
しましょう ΣΣ\Sigma アルファベットにしてみましょう x+,x−1,…,x−n∈Σ∗x+,x1−,…,xn−∈Σ∗x^+,x^-_1,\dots,x^-_n \in \Sigma^*そのアルファベットの文字列である。文字列を呼び出すs∈Σ∗s∈Σ∗s \in \Sigma^* 良ければsss のサブシーケンスです x+x+x^+ のサブシーケンスではない x−1,…,x−nx1−,…,xn−x^-_1,\dots,x^-_n。 与えられた x+,x−1,…,x−nx+,x1−,…,xn−x^+,x^-_1,\dots,x^-_n、私は最短の良い文字列を探しています sss。これに適したアルゴリズムはありますか?ワーストケースの実行時間がそれほど長くない場合でも、実用的なアルゴリズムに興味があります。私のドメインでは、文字列x+,x−1,…,x−nx+,x1−,…,xn−x^+,x^-_1,\dots,x^-_n かなり長いかもしれませんが、良い紐が存在すると思います sss それが役立つ場合、それはかなり短いです。 ケース n=1n=1n=1ある文字列の最下位サブシーケンスによって処理されます。これは別の文字列のサブシーケンスではありませんが、ケースに対処する必要がありますn&gt;1n&gt;1n>1。

2
短いシーケンスの編集距離の効率的なアルゴリズム
文字列のペア間の何十億ものレーベンシュタイン距離を計算する必要があるアプリケーションがあります。文字列は短い(長さが70)DNAシーケンスで、4文字のみで構成されています。また、文字列の1つが固定されていると仮定することもできます。つまり、1つの固定文字列を10億の他の文字列と比較しています。 レーベンシュタイン距離の動的プログラミングの実装はであることを知っています。改善の余地があるかどうか知りたいのですが。私はこれらの2つのアルゴリズムを見つけました:O(mn)O(mn)\mathcal{O}(m n) O(n+d2)O(n+d2)\mathcal{O}(n + d^2)アルゴリズムはBerghelらによる編集距離 です。しかし、私はが小さいと仮定することはできないので、何の利点もないかもしれませんdddddd log(n)O(1/ϵ)log(n)O(1/ϵ)log(n)^{\mathcal{O}(1/\epsilon)}Andoni et alによる時間での 近似。しかし、私はこれに関して2つの懸念があります。 n1+ϵn1+ϵn^{1+\epsilon} このアルゴリズムも実際には高速ですか? んの最悪の場合には、計算の編集距離があることを意味倍実際のもの?その場合は多すぎます。log(n)O(1/ϵ)log(n)O(1/ϵ)log(n)^{\mathcal{O}(1/\epsilon)}log(n)O(1/ϵ)log(n)O(1/ϵ)log(n)^{\mathcal{O}(1/\epsilon)} 適用できる他のアルゴリズム/アイデア/アプローチを知っていますか?

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