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

アルゴリズムは、問題に対する抽象的な解決策を定義する明確に定義された一連のステップです。このタグは、問題がアルゴリズムの設計と分析に関連している場合に使用します。

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

1
平均検索パフォーマンスを最小化する、固定長の決定木に似た特徴選択
私は、複雑なクエリ持っデータセットを検索するために使用されるが、Sを見つけるためにH 正確な = { S ∈ S | Q (sが) 真であるが }。各クエリは、平均時間を取るトンリニアサーチの全体的な時間があるので、T ⋅ | S | 。私は単純サブクエリQ_Iにダウンクエリを破り、見つけることができますHを約 = { S ∈ S | ∀ のq J(sが)真です}QQQSSSHexact={s∈S∣where Q(s) is True}Hexact={s∈S∣where Q(s) is True}H_\text{exact} = \{s \in S \mid \text{where $Q(s)$ is True}\}tttt⋅|S|t⋅|S|t\cdot |S|Happrox={s∈S∣∀qj(s)is True}Happrox={s∈S∣∀qj(s)is True}H_\text{approx} = \{s\in S \mid \forall q_j(s) …

3
Big O:依存関係のあるネストされたForループ
Big Oで宿題を与えられました。前のループに依存するforループが入れ子になっています。私は本当にそれを理解したいので、ここに私の宿題の質問の変更されたバージョンがあります: sum = 0; for (i = 0; i < n; i++ for (j = 0; j < i; j++) sum++; 私を後押ししているのはそのj < i部分です。ほぼ階乗のように実行されるようですが、追加されます。ヒントは本当にいただければ幸いです。

1
重複を効率的に、少ないメモリオーバーヘッドで削除する
結果セットのみを格納する必要があるように、重複の整数のリストを効率的にフィルター処理したいと思います。 これを確認できる1つの方法: 整数の範囲、大きい(たとえば)S={1,…,N}S={1,…,N}S = \{1, \dots{}, N\}NNN2402402^{40} 関数があり、衝突が多いと思われます(画像はに均一に分布しています)。f:S→Sf:S→Sf : S \to SSSS 次に、を格納する必要があり。つまり、f[S]f[S]f[S]{f(x)|x∈S}{f(x)|x∈S}\{f(x) | x \in S\} かなり正確な(確率的)推定値がありであるため、事前にデータ構造を割り当てることができます()。| f [ S ] | ≈ 2 30|f[S]||f[S]||f[S]||f[S]|≈230|f[S]|≈230|f[S]| \approx 2^{30} 私はいくつかのアイデアを持っていますが、何が最善のアプローチになるかわかりません: 入力セットがメモリに収まらないため、ビットセットは問題外です。 ハッシュテーブルですが、(1)メモリオーバーヘッドが必要です|f[S]||f[S]||f[S]|(2)作成時にテーブルを調査する必要があり、メモリのオーバーヘッドのために追加の時間が必要です。 「オンザフライ」ソート、できれば複雑度(非比較ソート)。それに関して、バケットソートとフラッシュソートの主な違いは何なのかわかりません。O(N)O(N)O(N) 二分探索木を持つ単純な配列ですが、これには時間必要です。O(Nlog|f[S]|)O(Nlog⁡|f[S]|)O(N \log |f[S]|) ブルームフィルターまたは同様のデータ構造を使用すると、問題の緩和(誤検知を伴う)に役立つ可能性があります。 stackoverflowの上のいくつかの質問は、物事のこの種に取り組むように見える(/programming/12240997/sorting-array-in-on-run-time、/programming/3951547/java -array-finding-duplicates)、しかし私の要件に一致するものはないようです。

3
最大要素をピボットとして選択した場合、Quicksortには常に2次ランタイムがありますか?
クイックソートアルゴリズムがあり、常に最小(または最大)の要素をピボットとして選択する場合。すでにソートされたデータセットを提供すると、「すでにソートされた」リストが昇順か降順かに関係なく、常に最悪のパフォーマンスが得られると私は思いますか? 私の考えでは、ピボットの最小要素を常に選択する場合、ピボットに対してソートするように選択されたサブセットは常に同じサイズ?

1
負のサイクルをキャンセルする
ジェネリックネガティブサイクルキャンセリングアルゴリズムを使用して、最小コストフローの問題を解決したいと考えています。つまり、ランダムな有効フローから始めて、最小平均コストサイクルなどの「良い」負のサイクルは選択せず、Bellman-Fordを使用して最小サイクルを発見し、発見されたサイクルに沿って拡張します。ましょうグラフ内のノードの数であり、Aのエッジの数、Uグラフにおけるエッジの最大容量、Wグラフにおけるエッジの最大コスト。次に、私の学習資料は次のように主張しています。VVVああAUUUWWW 最初の最大コストはA U W以下にする必要がありますA UWあUWAUW 1つの負のサイクルに沿った増加により、コストが少なくとも1ユニット削減されます 負のコストを許可しないため、最小コストの下限は0です。 負の各サイクルはO (VA )O(Vあ)O(VA) そして、アルゴリズムの複雑さはであると彼らは言う。私は各主張の背後にある論理を理解していますが、複雑さは異なると思います。具体的には、拡張の最大数は、拡張ごとに1単位のフローによって与えられ、A U Wからゼロまでのコストを取って、最大A U Wの拡張を提供します。それぞれについて負のサイクルを発見する必要があるので、増加の最大数にサイクルを発見するのに必要な時間(V A)を掛けてO (A 2 V UO (V2A UW)O(V2あUW)O(V^2AUW)A UWあUWAUWA UWあUWAUWVあVあVAアルゴリズム。O (A2VUW)O(あ2VUW)O(A^2VUW) これは学習教材の誤り(これは、コースからの学生のメモではなく、教授から提供されたテキストです)ですか、それとも私の論理は間違っていますか?

4
AのポイントとBのポイント間の最短距離
AAABBBnnnAAABBBmin { dist(p,q) | p∈A∧q∈B }min { dist(p,q) | p∈A∧q∈B }\min \space \{\mbox{ } \text{dist}(p, q) \mbox{ } | \mbox{ } p \in A \land q \in B \space \} 私が正しいかどうかはわかりませんが、この問題は計算幾何学の線形計画法で解決できる問題と非常によく似ています。ただし、LPへの削減は簡単ではありません。また、私の問題は、2次元空間で LPによって明らかに解決できる2組の点の間の最も薄い点を見つけることに関連しているようです。O(n)O(n)O(n)

1
スイープラインによる四角形のカバレッジ
残念ながら一人で練習できませんでした。 長方形のセットと長方形R 0。平面スイープアルゴリズムを使用して、R 0がR 1のセットで完全にカバーされているかどうかを判断します。。R n。R1..RnR1..RnR_{1}..R_{n}R0R0R_{0}R0R0R_{0}R1..RnR1..RnR_{1}..R_{n} 掃引ラインアルゴリズムの原理の詳細については、こちらを参照してください。 最初から始めましょう。最初は、2つのデータ構造を必要とするラインセグメントの交差を見つけるためのアルゴリズムとして、スイープラインアルゴリズムを知っています。 イベントポイントのセット(セグメントのエンドポイントと交差ポイントを格納します)QQQ ステータス(スイープラインが交差する一連のセグメントの動的構造)TTT 一般的な考え:スイープラインは、左から長方形のセットに近づき始める垂直線であると想定します。ソート全てのx矩形の座標とに格納Q昇順で-取るべきOを(N ログN )。最初のイベントポイントから開始し、すべてのポイントで特定のx座標で交差する長方形のセットを決定し、交差長方形の連続セグメントを識別し、それらが現在のx座標でR 0を完全にカバーしているかどうかを確認します。Tバイナリツリーとしてそれは取るつもりだO (ログをlllxxxQQQO(nlogn)O(nlog⁡n)O(n\log n)xxxR0R0R_{0}xxxTTT。R 0の一部が覆われていない場合、 R 0は完全には覆われていません。O(logn)O(log⁡n)O(\log n)R0R0R_{0}R0R0R_{0} 詳細:セグメント交差アルゴリズムの考え方は、隣接するセグメントのみが交差するというものでした。この事実に基づいて、ステータスを作成し、アルゴリズム全体で維持しました。この場合も同様のアイデアを見つけようとしましたが、これまでのところ成功していません。唯一言えることは、2つの長方形が対応するx座標とy座標が重なっている場合に交差することです。TTTxxxyyy 問題は、構築・維持する方法である、そしてどのような建物の複雑さと保守Tです。私はその前提とRの木が、この場合には非常に便利ですが、私は見られるように、R木を使用して最小の境界長方形を決定することは非常に困難です。TTTTTT この問題を解決する方法、特にを構築する方法について何か考えがありますか?TTT

1
新しいエントリを優先するランキングアルゴリズムを探す
私は、一定期間に投じられた投票に基づいてエントリーをランク付けするランキングシステムに取り組んでいます。平均のようなスコアを計算するアルゴリズムを探していますが、古いスコアよりも新しいスコアを優先したいと思います。私は次の線に沿って何かを考えていました: sはC O R E1+ 2 ⋅ S C O のR E 2 + ⋯ + N ⋅ S C O のR E ん1 + 2 + ⋯ + nscore1+ 2⋅score2 + ⋯+ ん⋅scoreん1+2+⋯+ん\frac{\mathrm{score}_1 +\ 2\cdot \mathrm{score}_2\ +\ \dots +\ n\cdot \mathrm{score}_n}{1 + 2 + \dots + n} このような状況で通常使用される他のアルゴリズムがあるかどうか疑問に思っていました。

1
中国の郵便配達員の問題:奇数次ノード間の最良の接続を見つける
私はプログラムを書いて、無向ドラフで中国の郵便配達員問題(ルートインスペクション問題とも呼ばれます)を解決し、現在、奇数のノードを接続するための最適な追加エッジを見つけるために問題に直面しているため、オイラー回路を計算できます。 (解決したいグラフのサイズを考えると)計算して評価する必要のあるエッジの膨大な組み合わせがあるかもしれません。 例として、奇数次ノードます。最適な組み合わせは次のとおりです。A,B,C,D,E,F,G,HA,B,C,D,E,F,G,HA, B, C, D, E, F, G, H 、 C D、 E F、 G HABABABCDCDCDEFEFEFGHGHGH 、 B D、 E H、 F GACACACBDBDBDEHEHEHFGFGFG 、 B C、 E G、 F HADADADBCBCBCEGEGEGFHFHFH ....AEAEAE ABABABAAABBB したがって、私の質問は次のとおりです。その問題を純粋な総当たりよりも複雑に解決する既知のアルゴリズムはありますか(それらすべてを計算して評価します)? €:いくつかの調査の結果、「エドモンズの最小長マッチングアルゴリズム」について話しているこの記事を見つけましたが、このアルゴリズムの疑似コードや学習者記述は見つかりません(または少なくともGoogleとして認識していません) J. Edmondsによる一致アルゴリズムのヒット数が多い)

2
ブランチとバウンドの説明
ブランチとバインドされたアルゴリズムに関するテストがあります。このアルゴリズムがどのように機能するかを理論的に理解していますが、このアルゴリズムを実際に実装する方法を示す例は見つかりませんでした。 このような例をいくつか見つけました が、それでも混乱しています。巡回セールスマンの問題も探しましたが、理解できませんでした。 私が必要とするのは、いくつかの問題と、これらの問題をブランチとバウンドを使用してどのように解決できるかです。

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
虚数の根を持つ特性多項式を介して反復を解く
アルゴリズム分析では、反復を解決する必要があることがよくあります。マスター定理、置換および反復法に加えて、特性多項式を使用するものがあります。 特徴的な多項式バツ2− 2 x + 2バツ2−2バツ+2x^2 - 2x + 2が虚数の根、つまりバツ1= 1 + iバツ1=1+私x_1 = 1+iおよびを持っていると私が結論付けたとしましょうバツ2= 1 − iバツ2=1−私x_2 =1-i。その後、私は使用できません c1⋅ Xん1+ c2⋅ Xん2c1⋅バツ1ん+c2⋅バツ2ん\qquad c_1\cdot x_1^n + c_2\cdot x_2^n 解を得るためにね この場合、どうすればよいですか?

3
対数対二重対数時間の複雑さ
使用する際に実際のアプリケーションでは、具体的な利点がありますの代わりにO(ログ(N ))のアルゴリズム?O(ログ(ログ( n ))O(ログ⁡(ログ⁡(ん))\mathcal{O}(\log(\log(n))O(ログ(n ))O(ログ⁡(ん))\mathcal{O}(\log(n)) これは、従来の二分探索木実装の代わりに、たとえばvan Emde Boas木を使用する場合です。ただし、たとえば、場合、最良の場合、対数アルゴリズムは対数アルゴリズムよりも(約)5倍優れています。また、一般的に、実装はよりトリッキーで複雑です。n &lt; 106ん&lt;106n < 10^6555 私が個人的にVEBツリーよりもBSTを好むとすれば、どう思いますか? 簡単にそれを示すことができます: ∀ N &lt; 106。ログ んログ(ログ( n ))&lt; 5.26146∀ん&lt;106。 ログ⁡んログ⁡(ログ⁡(ん))&lt;5.26146\qquad \displaystyle \forall n < 10^6.\ \frac{\log n}{\log(\log(n))} < 5.26146

3
最長経路問題に最適な部分構造がない理由は何ですか?
私が最も長いパスについて学習し、問題が最適なサブ構造を欠いていたため、一般的なグラフで最長のパスは動的計画法によって解くことができないという事実に出くわしました(私は文が最長に修正する必要があると思われた簡単な一般的なグラフにパスされていない解けることにより、動的プログラミング)。 それらが単純である必要があると想定する場合(何らかの理由でこれは必要ですが、まだ理解していません)最長であれば、反例を作成するのは簡単です。4つのノードA→B→C→D→Aを持つ正方形グラフを考えてみます。 AからDへの最長パスは、明らかにA→B→CDです。ただし、BからCへの最長パスはB→A→D→Cであり、パスB→C(これは、この場合、実際には最短経路です!)。 これは、パスを単純にする必要があるためにのみ機能するようです。最適な部分構造が存在しないことを証明するために、パスは単純である必要があると想定する必要がありますか? 私は反例が良い証拠/証拠であるはずだと思います(私はそれを否定しません)、私は反例が非常に啓発的であるとまったく思いません。なぜそれが最適な部分構造を許可しないという点を証明するのかはわかりますが、最長経路の最適部分構造がないはずであることが明らかである理由を実際に理解または直感することができません。たとえば、切り取りと貼り付けの引数が機能しないのはなぜですか?サブパスが最も長くない場合は、より長いパスをそのまま使用してください。それはとても魅力的に聞こえます、つまり、私たちがより長いものを配置した場合、もちろんそれは長くなるはずです...しかし、これは何らかの理由で間違っています。この例は実際にDPが決してできないことを実際に証明していますか最長(シンプル?)パスを効率的に解決しますか?私はそれがPにないという一般的な証明を要求しません(それはP対NPソリューションを求めている可能性があるため)。私はちょうどそれその証拠の後だ解くことができないDPによって(またはDPは、この最長経路問題を解決することはできないというか、問題がないことを、少なくとも非常に強力な証拠ではない最適なサブ構造を持っています)。 私はウィキペディアで問題がNP-Hardであることを明確に見てきました。つまり、おそらく高速なアルゴリズムはありません。それが、最適な部分構造に明らかに欠けているべき証拠を提供するために存在する証拠/直感の唯一のタイプであるかどうか(または欠けていない場合、問題をより速くするために使用できないこと)はわかりません。それが高速の動的プログラムで解決できないことを示す唯一の方法ですか? シンプルが必要な理由です私たちがその要件を設けない場合、問題は些細な/興味のないものになるのですか?言い換えると、サイクルがある場合、そのサイクルから到達可能なすべてのノードへの最長パスの問題が(そのサイクルへのパスを見つけることによって)解決されています。到達可能なサイクルがないノードの場合、非循環グラフがあり、これはDPで解決できます(重みが正の場合)。さらに、サイクルがある場合は、自動的に物事が最適な部分構造を持つようになりました(私はそう思います)。最長パスは、2つのケースをカバーする最長パスで構成されているためです。どちらにも最適な部分構造が含まれています。だから、問題は単純なパスを必要とせずに取るに足らないものになったのですか?または、何か不足しているのですか、それとも単純なパスが必要なのかについてのより良い説明がありますか?しない一般的な最長パスは DPで解決できますか? また、DPを使用できないことを保証するために必要な要件は100%わかりません。負のエッジの重み、正の、重み付けされていない、有向、無向である必要がありますか?要件は何ですか?

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