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

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

2
最大7つの比較で5つの整数の配列をソートします
最悪の場合に7つの比較が必要になるように、5つの整数のリストをソートするにはどうすればよいですか?他の操作がいくつ実行されるかは気にしません。私は整数について特別なことは何も知りません。 私はマージソートアプローチに従うか、マージソートとバイナリサーチを使用して挿入位置を見つけるなど、8つの比較にまで下がったいくつかの異なる分割統治アプローチを試しましたが、最終的には8つの最悪の場合を比較します。 今のところ、解決策ではなく、ヒントを探しています。

1
Ukkonenのアルゴリズムの実行時間はアルファベットサイズにどのように依存しますか?
Ukkonenのアルゴリズムの漸近的な実行時間、おそらく線形(?)時間でサフィックスツリーを構築するための最も一般的なアルゴリズムの問題に関心があります。 これは、ダンガスフィールドによる本「ストリング、ツリー、シーケンスのアルゴリズム」からの引用です(セクション6.5.1)。 "... Aho-Corasick、Weiner、Ukkonen、およびMcCreightアルゴリズムはすべてスペースを必要とするか、O (m )時間境界を最小のO (m log m )およびOに置き換える必要があります(m log |Θ (m | Σ |)Θ(m|Σ|)\Theta(m|\Sigma|)O (m )O(m)O(m)O (m ログm )O(mログ⁡m)O(m \log m) "。O (m ログ| Σ | )O(mログ⁡|Σ|)O(m \log|\Sigma|) [ mmmは文字列の長さ、はアルファベットのサイズ]ΣΣ\Sigma なぜそうなのか分かりません。 スペース:まあ、サイズ配列を使用してノードからの分岐を表す場合、実際、Θ (m | Σ |)スペース使用になります。ただし、私の知る限り、ハッシュテーブル(Pythonの辞書など)を使用してブランチを保存することもできます。その後、O (1 )の子ノードにアクセスできる一方で、すべてのハッシュテーブルにΘ (m )ポインターのみを格納します(ツリーにはΘ (m )エッジがあるため)。Θ (| Σ |)Θ(|Σ|)\Theta(|\Sigma|)Θ (m | Σ …


5
二部グラフの最大独立セット
私はバイパライトグラフの最大独立セットを見つけようとしています。 「1998年5月13日-ワシントン大学-CSE 521-ネットワークフローのアプリケーション」というメモで次のことがわかりました。 問題: 二部グラフ与えられると、可能な限り大きな独立集合を見つけます。ここで、およびです。セットの要素間にのエッジがない場合、セットは独立しています。G = (U、V、E)G=(U,V,E)G = (U,V,E)うん′∪ V′U′∪V′U' \cup V'うん′⊆ UU′⊆UU' \subseteq UV′⊆ VV′⊆VV' \subseteq VEEE 解決: 頂点フローグラフを作成します。各エッジには、から までの無限の容量エッジがあります。各には、からまで単位容量エッジがあり、各には、から までの単位容量エッジがあります。U∪V∪{s,t}U∪V∪{s,t}U \cup V \cup \{s,t\}(u,v)∈E(u,v)∈E(u,v) \in Euuuvvvu∈Uu∈Uu \in Usssuuuv∈Vv∈Vv \in Vvvvttt 有限容量カット検索と、と。レッツ と。セットは、カットを横切る無限の容量のエッジがないため、独立しています。カットのサイズは。これは、独立セットを可能な限り大きくするために、カットを可能な限り小さくします。(S,T)(S,T)(S,T)s∈Ss∈Ss \in St∈Tt∈Tt \in TU′=U∩SU′=U∩SU' = U \cap SV′=V∩TV′=V∩TV' = V \cap TU′∪V′U′∪V′U' \cup V'|U−U′|+|V−V′|=|U|+|V|−|U′∪V′||U−U′|+|V−V′|=|U|+|V|−|U′∪V′||U - U'| …

3
線は2セットのポイントを分離します
2セットのポイントを線で区切ることができるかどうかを識別する方法がある場合 我々は2つの点の集合有するおよび分離する線が存在する場合と、その結果、すべての点のみ線の一方の側に、そしてすべての点とのみ他方の側に。B A B A A B BAAABBBAAABBBAAAAAABBBBBB 私が思いついた最も素朴なアルゴリズムは、と凸多角形を構築し、それらの交差をテストすることです。凸多角形の構築に関しては、時間の複雑さは必要があると思われ。実際、時間の複雑さの改善は期待していませんが、改善できるかどうかはわかりません。しかし、少なくとも、そのような線があるかどうかを判断するためのより美しい方法があるはずです。B O (n log h )AAABBBO(nlogh)O(nlog⁡h)O(n\log h)

3
2つのアルゴリズムの比較にランタイムではなく比較を使用する理由
いくつかのCS研究論文では、2つのアルゴリズムの効率を比較するために、実際の計算時間自体ではなく、アルゴリズムの主要な比較の総数が使用されていることに気付きました。両方のプログラムを実行し、アルゴリズムの実行に必要な合計時間をカウントすることで、どちらが優れているかを比較できないのはなぜですか?

1
ランダムテストグラフアルゴリズムの入力を生成しますか?
アルゴリズムをテストする場合、一般的なアプローチはランダムテストです。ある分布(通常は均一)に従ってかなりの数の入力を生成し、それらに対してアルゴリズムを実行して、正当性を検証します。最新のテストフレームワークでは、いくつかの制限がありますが、アルゴリズムシグネチャを指定して自動的に入力を生成できます。 入力が数字、リスト、または文字列の場合、そのような入力を簡単に生成します。ツリーはより難しくなりますが、それでも簡単です(確率的な文脈自由文法または同様のアプローチを使用)。 ランダムグラフを(効率的に)生成するにはどうすればよいですか?通常、グラフをランダムに均一に選択することは、望むものではありません。それらは接続されているか、平面であるか、サイクルフリーであるか、他のプロパティを満たしている必要があります。拒否サンプリングは、潜在的に膨大な望ましくないグラフのセットのため、次善のようです。 注目すべき有用な分布は何ですか?ここで有用なのは グラフは手元のアルゴリズムを十分にテストする可能性が高く、 効果的かつ効率的に生成できます。 ランダムグラフには多くのモデルがあることを知っているので、この点でグラフ生成に最適な洞察に感謝します。 「あるアルゴリズム」が一般的すぎる場合は、テスト中のアルゴリズムの具体的なクラスとして、最短パス検索アルゴリズムを使用してください。テスト用のグラフは、接続されており、かなり高密度である必要があります(高い確率で、または少なくとも予想)。テストの場合、最適な解決策は、最短のパスの周りにランダムなグラフを作成して、目的の結果を知ることです(別のアルゴリズムを使用する必要はありません)。

2
無向グラフ上の最短経路?
だから私はこの(多少基本的な)質問はここに属していると思った: サイズが100のノードのグラフが10x10のパターンで配列されているとします(チェス盤を考えてください)。グラフは無向であり、重み付けされていません。グラフを移動するには、3つのスペースを前方に移動し、1つのスペースを右または左に移動します(チェスナイトがボード上を移動するのと同様)。 開始ノードが固定されている場合、ボード上の他のノードへの最短パスをどのように見つけますか? 実行可能な移動であるノード間にのみエッジがあると想像しました。したがって、この情報が与えられたら、開始ノードから終了ノードまでの最短パスを見つけたいと思います。 私の最初の考えは、各エッジは重み1で重み付けされるということでした。しかし、グラフは無向であるため、ジクストラは理想的なフィットではありません。したがって、私は深さ優先検索の変更された形式を使用してそれを行うことにしました。 しかし、検索を使用して最短経路を取得する方法を視覚化することはできませんでした。 私が試したもう1つのことは、開始ノードをルートとしてツリー形式でグラフを配置し、次に希望の終了ノードを与えた最も浅い(最も低い行番号)結果を選択することでした...これはうまくいきましたが、非常に効率的ではなかったため、大きなグラフでは機能しません。 誰かが私にこの方向性を正しい方向に向けるようなアイデアを持っていますか? どうもありがとうございました。 (グラフの視覚化を試みましたが、評判が悪いためできませんでした)

1
分散アルファベータプルーニング
私は、分散アーキテクチャでアルファ-ベータプルーニングを使用してチェスのミニマックス検索ツリーを処理できる効率的なアルゴリズムを探しています。私が見つけたアルゴリズム(PVS、YBWC、DTSは下記参照)はすべてかなり古い(1990年が最新)。それ以来、多くの大きな進歩があったと思います。この分野の現在の標準は何ですか? また、私が読んだ研究論文からは理解できないので、DTSについての馬鹿の説明を教えてください。 上記のアルゴリズム: PVS:原理変動の分割 YBWC:ヤングブラザーズウェイトコンセプト DTS:動的なツリー分割 ここですべて議論されます。

3
特定の半径の最大包囲円
私は次の問題へのアプローチを見つけようとします: 点と半径のセットが与えられたら、円の中心点を見つけて、円がそのセットの最大数の点を含むようにします。実行時間はなければなりません。SSSrrrO(n2)O(n2)O(n^2) 最初は、最小の包囲円問題に似ているように見えましたが、これはで簡単に解決できます。アイデアは、任意の中心を設定し、すべての点を囲むことでした。次に、段階的に、左/右端の点に触れるように円を置き換え、指定された半径に円を縮小します。明らかに、これは機能しません。O(n2)O(n2)O(n^2)SSS

2
型検査アルゴリズム
型チェックアルゴリズムに関する個人の書誌研究を始めていますが、いくつかのヒントが必要です。最も一般的に使用されるタイプチェックアルゴリズム、戦略、および一般的な手法は何ですか? 特に、C ++、Java 5 +、Scalaなどの広く知られている強力な静的型付け言語で実装された複雑な型チェックアルゴリズムに興味があります。IE、基礎となる言語(Java 1.4以下など)の非常に単純なタイピングのために非常に単純ではないタイプチェックアルゴリズム。 私は、X、Y、またはZの特定の言語自体には興味がありません。ターゲット言語に関係なく、型チェックアルゴリズムに興味があります。「聞いたことのない言語Lで強く型付けされており、型付けが複雑な言語には、アルゴリズムZを使用してXとYをチェックすることでA、B、Cを実行する型チェックアルゴリズムがあります」または「 Scalaで使用されるストラテジーXとY、およびC#で使用されるAのバリアントZは、R、S、Tの機能がそのように機能するためクールです」と答えがあります。

5
動的プログラミングの事例の区別:例が必要です!
私はしばらくの間、動的プログラミングに取り組んできました。動的プログラミングの再帰を評価する標準的な方法は、必要なすべての値のテーブルを作成し、行ごとに入力することです。たとえば、Cormen、Leiserson et al: "Introduction to Algorithms"を参照してください。 2次元のテーブルベースの計算スキーム(行ごとの塗りつぶし)に焦点を当て、セルの依存関係の構造、つまり、別のセルを計算する前にどのセルを実行する必要があるかを調べます。セルiが依存するセルのインデックスのセットを示します。Γはサイクルフリーである必要があることに注意してください。Γ(i)Γ(i)\Gamma(\mathbf{i})ii\mathbf{i}ΓΓ\Gamma 計算された実際の関数から抽象化し、その再帰構造に集中します。正式には、次の形式の場合、繰り返しは動的プログラミングであると考えます。ddd d(i)=f(i,Γ˜d(i))d(i)=f(i,Γ~d(i))\qquad d(\mathbf{i}) = f(\mathbf{i}, \widetilde{\Gamma}_d(\mathbf{i})) 、〜Γ D(I)= { (J、D (J))| J ∈ Γ D(I)}とFしないいくつかの(計算)関数使用D経由以外の〜Γの dは。i∈[0…m]×[0…n]i∈[0…m]×[0…n]\mathbf{i} \in [0\dots m] \times [0\dots n]Γ˜d(i)={(j,d(j))∣j∈Γd(i)}Γ~d(i)={(j,d(j))∣j∈Γd(i)}\widetilde{\Gamma}_d(\mathbf{i}) = \{(\mathbf{j},d(\mathbf{j})) \mid \mathbf{j} \in \Gamma_d(\mathbf{i}) \}fffdddΓ˜dΓ~d\widetilde{\Gamma}_d 粒度制限すると(現在のセルの左、左上、上、右上、...に)粗い部分に1が有効の3例(アップ対称性及び回転)は、本質的に存在していることを観察しますテーブルへの入力方法を通知する動的プログラミングの再帰:ΓdΓd\Gamma_d 赤い領域は(過剰近似)を示します。ケース1と2はサブセットを認め、ケース3は最悪の場合です(インデックス変換まで)。赤い領域全体がΓで覆われている必要はないことに注意してください。テーブルのすべての赤い部分の一部のセルは、それを赤く塗るのに十分です。白い領域には、必要なセルが含まれないようにする必要があります。ΓΓ\GammaΓΓ\Gamma ケース1の例は、編集距離と最長共通サブシーケンスであり、ケース2はBellman&FordおよびCYKに適用されます。あまり明らかではない例には、提案されたケースに合うように回転できるため、行(または列)ではなく対角線で機能するものが含まれます。例については、ジョーの回答を参照してください。 ただし、ケース3の(自然な)例はありません!だから私の質問は:ケース3の動的プログラミングの再帰/問題の例は何ですか?

6
動的プログラミングとブルートフォースの違い
次の引用に出会ったとき、私はダイナミックプログラミングを読んでいました 動的プログラミングアルゴリズムは、問題を解決するために考えられるすべての方法を調べ、最適なソリューションを選択します。したがって、ダイナミックプログラミングは、インテリジェントなブルートフォースの方法であるとおおまかに考えることができます。これにより、考えられるすべてのソリューションを選択して、最良のソリューションを選択できます。問題の範囲がすべての可能なソリューションを通過することが可能であり、十分に高速である場合、動的プログラミングは最適なソリューションを見つけることを保証します 次の例を示しました たとえば、ラッシュアワー中に特定の都市で、できるだけ早くポイントAからポイントBに移動しなければならないとしましょう。ダイナミックプログラミングアルゴリズムは、トラフィックレポート全体を調べて、考えられるすべての道路の組み合わせを調べて、どちらの方法が最も速いかを示します。もちろん、アルゴリズムが終了するまでしばらく待たなければならない場合があり、そうして初めて運転を開始できます。あなたが進む道は最速のものになります(外部環境で何も変わらないと仮定すると) ブルートフォースは、最善の解決策を決定する前に、考えられるあらゆる解決策を試みています。 それがまたあればどのように動的ブルートフォースは異なるプログラミングされて最適なものを選ぶ前に、すべての可能な解決策を通過し、私が見る唯一の違いは、動的プログラミングは、アカウントに追加の要因(この場合は交通状況を)取ることです。 動的計画法はブルートフォース法のサブセットであると言ってもいいですか?

1
ニューラルネットワークのVC次元の効率的な計算または近似
私の目標は、入力と出力で説明した次の問題を解決することです。 入力: 非循環有向グラフとM個のノード、N源、及び1つのシンク(M > N ≥ 1)。GGGmmmnnn111m>n≥1m>n≥1m > n \geq 1 出力: トポロジGのニューラルネットワークのVC次元(またはその近似)。GGG より詳細: 各ノードはシグモイドニューロンです。トポロジは固定されていますが、エッジの重みは学習アルゴリズムによって異なる場合があります。GGG 学習アルゴリズムは固定されています(後方伝播など)。 ソースノードは、入力ニューロンでのみから文字列を取ることができ、{ - 1 、1 } nは入力として。nnn{−1,1}n{−1,1}n\{-1,1\}^n シンクノードは出力ユニットです。それから、実際の値を出力し我々は切り上げることを1またはダウン- 1それは、より特定の固定のしきい値を超える場合δ離れてから0。[−1,1][−1,1][-1,1]111−1−1-1δδ\delta000 素朴なアプローチは、単にそれらを使ってネットワークを訓練しようとすることで、ますます多くのポイントを壊そうとすることです。ただし、この種のシミュレーション手法は効率的ではありません。 質問 この関数を計算するための効率的な方法はありますか(つまり、決定問題に変更されたときの:VC次元は入力パラメーターkよりも小さい?)?そうでない場合、硬度の結果はありますか?PP\mathsf{P}kkk この関数を計算または近似するための実用的な方法はありますか?近似値である場合、その精度について保証はありますか? ノート stats.SE についても同様の質問をしましたが、興味はありませんでした。

5
理論的なコンピューターサイエンスで高速アルゴリズムとはどういう意味ですか?
ある問題A で時間で実行されているアルゴリズムがあり、誰かが時間で実行されているアルゴリズムを考え出す場合、、以前のアルゴリズムよりも改善されていると考えられますか?O(f(n))O(f(n))O(f(n))O(f(n)/g(n))O(f(n)/g(n))O(f(n)/g(n))g(n)=o(f(n))g(n)=o(f(n))g(n) = o(f(n)) 理論的なコンピューターサイエンスの文脈において、このようなアルゴリズムを考案することは理にかなっていますか?
18 algorithms 

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