タグ付けされた質問 「algorithm-analysis」

アルゴリズムの特性を決定する科学と芸術に関する質問。多くの場合、正確性、実行時間、スペースの使用法が含まれます。アルゴリズムのランタイムに関する質問には、[runtime-analysis]タグを使用します。

2
2次元ピーク検出の複雑さ(MIT OCW 6.006)
43:30のMIT OCW 6.006の朗読ビデオで、 m列n行の行列Aが与えられた場合、2次元ピーク検出アルゴリズムは、ピークが隣接する隣接セル以上の任意の値である場合、次のように記述されます。m × nm×nm \times nあAAメートルmmんnn 注:を使用して列を説明する際に混乱がある場合は、申し訳ありませんが、これは、朗読ビデオがそれを説明する方法であり、ビデオと一貫性を保つように努めました。それは私をとても混乱させました。んnn 真ん中の列を選択 // 複雑さがありますΘ (1 )n / 2n/2n/2Θ (1 )Θ(1)\Theta(1) 列の最大値を見つける// 列にm行があるため、複雑度 Θ (m )があるn / 2n/2n/2Θ (m )Θ(m)\Theta(m)メートルmm 水平を確認してください。最大値の行の近傍、それがより大きい場合はピークが検出され、それ以外の場合は再帰します// 複雑さT (n / 2 、m )を持ちますT(n / 2 、m )T(n/2,m)T(n/2, m)T(n/2,m)T(n/2,m)T(n/2,m) 次に、再帰を評価するために、暗唱インストラクターは言います は、最大値を見つけるためT(1,m)=Θ(m)T(1,m)=Θ(m)T(1,m) = \Theta(m) T(n,m)=Θ(1)+Θ(m)+T(n/2,m)(E1)(E1)T(n,m)=Θ(1)+Θ(m)+T(n/2,m) T(n,m) = \Theta(1) + \Theta(m) + …

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

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) これは学習教材の誤り(これは、コースからの学生のメモではなく、教授から提供されたテキストです)ですか、それとも私の論理は間違っていますか?

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


2
A *グラフ検索時間の複雑さ
時間の複雑さとA *に関する混乱。 A * Wikiによると 、時間の複雑さは解の深さで指数関数的です(最短経路): A *の時間の複雑さはヒューリスティックに依存します。無制限の探索空間の最悪の場合、展開されたノードの数は、解の深さ(最短経路)dで指数関数になります。O (bd)O(bd)O(b^d)、 どこ bbb 分岐因数(州ごとの平均の後継者数)です。 この受け入れられた回答へのコメントは、グラフのサイズの観点から複雑さを与える方が理にかなっていることを指摘しているため、O ((| V| + | E| )⋅LOG| V| )O((|V|+|E|)⋅log|V|)O((|V| + |E|) \cdot log |V|) 明らかに、ヒューリスティックがすべてのノードに0の値を割り当てる場合、A *はダイクストラのアルゴリズムになり、均一コストのヒューリスティックは本質的にヒューリスティックを無効にします。 ヒューリスティックを O (1 )O(1)O(1) (そして一貫性のある)、最悪のケースは本質的にA *を複雑度のあるダイクストラのアルゴリズムに劣化させていることは理にかなっています O (| E| + | V| ログ| V| )O(|E|+|V|log⁡|V|)O(|E|+|V|\log|V|) 最小優先度のキューの実装(フィボナッチヒープ)。 私が間違っている? 私がこれまで見てきた本などは、ソリューションの深さに関して複雑さを与えます

1
再帰挿入ソートの繰り返し
CLRSからこの問題を試しました(ページ39、2.3-4) 挿入ソートは次のように再帰的な手続きとして表現できます。ソートするA[1... n]には、再帰的にソートしてA[1... n-1]からA[n]、ソートされた配列に挿入しA[1... n-1]ます。この再帰バージョンの挿入ソートの実行時間の再帰を記述します。 私が形成した再発は T(n)={Θ(1)T(n−1)+Θ(n)if n=1,if n&gt;1.T(n)={Θ(1)if n=1,T(n−1)+Θ(n)if n&gt;1. T(n) = \begin{cases}\Theta(1) & \textrm{if } n = 1,\\ T(n-1) + \Theta(n) & \textrm{if } n > 1. \end{cases} 私の推論 の基本ケースでは、リストはソートされるため、作業は発生せず、時間が一定になります。n=1n=1n = 1 他のすべてのケースでは、時間はシーケンスのソートとそのシーケンスA[1...n-1]への挿入に依存します。したがって、それはそれらの合計、すなわちます。T(n−1)+Θ(n)T(n−1)+Θ(n)T(n-1) + \Theta(n) 再発関係が正しいか知りたい。そうでない場合、間違いは何ですか?どのようにして再発関係を正しく定式化するのですか?

1
何が操作としてカウントされますか?
初心者の質問にはお詫びしますが、アルゴリズムの時間の複雑さを計算するときに「単純な操作」として正確に何がカウントされるかについて少し混乱しています。特に、すべての操作が等しいと考えるのはなぜですか? 確かに、2つの非常に大きな数値を除算することは、数値に1を加えるよりも時間がかかります(forループの各反復の場合のように)。たとえば、乗算は小さな加算をいくつでも構成できます。それで、それらを単に加算する代わりに、演算のタイプ(加算、乗算など)と関連する数値のサイズに応じて、各演算にある種の重みを適用するべきではありませんか? 私の問題は、アルゴリズムの複雑さがO (f )(一部の関数fの場合)であることを証明するよう求められていることです。 「簡単な操作」。それで、私はこれについてどうしますか?O (f)O(f)O(f)fff

1
線形時間での圧縮/エンコードについて
私はNJ Larsson、A. Moffat:Offline Dictionary-Based Compressionの論文を読んでいます。これは、私が正しく理解していれば、バイトペアエンコーディングに非常に似ている圧縮アルゴリズムについて説明しています。 長さnの文字列が与えられた場合、この圧縮方法を使用して線形O(n )時間で圧縮する方法を理解しようとしています。これはどのように正確に行われますか?私はこの論文を読みましたが、どのようにして線形時間を達成するのかまだ理解していません。そのため、別の方法で説明されているのかもしれません。SSSnnnO(n)O(n)\mathcal O (n) 私の最初の混乱は、アルゴリズムの最初のステップで発生します。たとえばabcababcabc、最も一般的なペアabが新しいシンボルに置き換えられる場合などXcXXcXcです。最も一般的なペアをすばやく見つける方法がわかりません。私の素朴なアプローチは、最初のペアabを最初に見て、bc発生数を数え、次に次のペアを見て、発生数を数えるなどです。しかし、これは、最も多くを見つけるためだけにすでに与えます。共通のペア1回。O(n2)O(n2)\mathcal O (n^2) 次に、時間で最も一般的なペアを見つける方法を理解したとしても。私の次の問題は、O(n )回までの最も一般的なペアを見つける必要がないかということです。したがって、これはO(n 2)の合計時間を与えますか?O(n)O(n)\mathcal O(n)O(n)O(n)\mathcal O(n)O(n2)O(n2)\mathcal O(n^2)

1
メディアントを使用したブラケット検索の複雑さは何ですか?
Rekoデコンパイラー用に作成したアルゴリズムの複雑さを推定しようとしています。ここで、コンパイラーが定数による整数除算に行った変換を「取り消す」ようにしています。コンパイラーは除算を整数の乗算とシフトに変換しました:、ここではコンピューターのマシンワードのビット数です。結果の定数乗算は、ほとんどの現代的なアーキテクチャでの除算よりもはるかに高速ですが、元のコードに似ていません。(X * ⌊ 2 β / N ⌋ )&gt; &gt; β βx/nx/nx / n(x∗⌊2β/n⌋)&gt;&gt;β(x∗⌊2β/n⌋)&gt;&gt;β(x * \lfloor 2^\beta / n \rfloor) >> \betaββ\beta 説明するには:Cステートメント y = x / 10; Microsoft Visual C ++コンパイラによって、次のアセンブリ言語にコンパイルされます mov edx,1999999Ah ; load 1/10 * 2^32 imul eax ; edx:eax = dividend / 10 * 2 ^32 …


1
この再帰的アルゴリズムの実行時間はどれくらいですか?
A229037 の最初の値を計算するというコードゴルフチャレンジのために、次の(無記号の)Haskellプログラムを作成しました。nnn これは、番目の値を計算するために提案するソリューションです。nnn a n | n&lt;1 = 0 | n&lt;3 = 1 | otherwise = head (goods n) goods n = [x | x &lt;- [1..], isGood x n] isGood x n = and [ x - a(n-k) /= a(n-k) - a(n-k-k) || a(n-k-k) == 0 | k &lt;- …

1
プレフィックスパリティ問題のアルゴリズム
プレフィックスパリティの問題は、次のように定義できます。長さ文字列が与えられ、最初はすべての文字がです。次に、次のような更新をサポートできるデータ構造を構築します。n 0SSSんnn000 特定のについて、をまたは変更しますS [ i ] 0 1私iiS[ 私]S[i]S[i]000111 与えられたに対して、のパリティを見つけます。S [ 1 ] + S [ 2 ] + 。。。+ S [ i ]私iiS[ 1 ] + S[ 2 ] + 。。。+ S[ 私]S[1]+S[2]+...+S[i]S[1]+S[2]+...+S[i] 私の頭の上から、データ構造を構築するために線形空間と線形前処理時間のみを使用しながら、時間でこれらのタイプのクエリをサポートできるソリューションがあり。葉が個々の文字に対応する文字列の上に完全なバイナリ検索ツリーを構築し、すべての内部ノードに、そのノードで定義されたサブツリーで葉であるすべての文字の合計を格納するという考え方です。このようにして、両方の更新を時間で簡単にサポートできます。S O (log n )O (ログn )O(log⁡n)O(\log n)SSSO (ログn )O(log⁡n)O(\log n) しかし、私はこの問題の下限を証明する論文を見つけました。更新についてはよりも優れているとは言えず、次の論文も見つけましたhttp://link.springer.com/chapter/10.1007%2F3-540-51542-9_5、およびpdfへの直接リンク。その範囲を達成するアルゴリズムを提供するため、最適です。O (ログんログログん)O(log⁡nlog⁡log⁡n)O(\frac{\log n}{\log \log n}) …

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