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

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


2
なぜ確率を掛けるよりもログの確率を速く加えるのですか?
質問を組み立てるために、コンピューターサイエンスでは、いくつかの確率の積を計算することがよくあります。 P(A,B,C) = P(A) * P(B) * P(C) 最も単純なアプローチは、単にこれらの数値を掛けることであり、それが私がやろうとしていたことです。しかし、上司は、確率のログを追加する方が良いと言いました。 log(P(A,B,C)) = log(P(A)) + log(P(B)) + log(P(C)) これにより対数確率が得られますが、必要に応じて後で確率を取得できます。 P(A,B,C) = e^log(P(A,B,C)) ログの追加は、次の2つの理由により優れていると考えられます。 確率の積が非常に小さいためゼロに丸められる「アンダーフロー」を防ぎます。多くの場合、確率は非常に小さいため、これはリスクとなります。 多くのコンピューターアーキテクチャが乗算よりも速く加算を実行できるため、高速です。 私の質問は2番目のポイントについてです。これは私がそれを説明したのを見た方法ですが、ログを取得するための追加コストを考慮していません!「ログのコスト+加算のコスト」を「乗算のコスト」と比較する必要があります。それを考慮に入れた後、それはまだ小さいですか? また、ウィキペディアのページ(Log potential)はこの点で混乱を招いており、「ログ形式への変換は高価ですが、一度しか発生しません」と述べています。追加する前にすべての用語のログを個別に取得する必要があると思うため、これは理解できません。私は何が欠けていますか? 最後に、「コンピューターは乗算よりも加算を高速に実行する」という正当性は曖昧です。それはx86命令セットに固有のものですか、それともプロセッサアーキテクチャのより基本的な特性ですか?

3
逆アッカーマンよりも成長が遅い関数は、実行時の境界に表示されますか?
一部の複雑なアルゴリズム(union-find)には、漸近時間の複雑さに現れるほぼ一定の逆アッカーマン関数があり、ほぼ一定の逆アッカーマン項が無視される場合、最悪の場合の最適時間です。 最もよく知られている最悪の場合の時間を与える、逆アッカーマンよりも基本的に遅くなる関数(多項式または指数などの変換の下でアッカーマンと等価ではない関数の逆関数)を含む実行時間を持つ既知のアルゴリズムの例はありますか根本的な問題を解決するための複雑さ?

7
時間複雑度アルゴリズムの特徴は何ですか?
アルゴリズムの時間の複雑さを慎重に調べることで、簡単に特定できる場合があります。 2つのネストされたループを持つアルゴリズムは、明らかにN 2です。2つの値のNグループのすべての可能な組み合わせを探索するアルゴリズムは、明らかに2 Nです。NNNN2N2N^2NNN2N2N2^N しかし、複雑さを持つアルゴリズムを「見つける」方法はわかりません。たとえば、再帰的なマージソートの実装は1つです。mergesortまたは他のΘ (N log N )アルゴリズムの一般的な特性は、分析するときに手がかりになりますか?Θ (NログN)Θ(Nlog⁡N)\Theta(N \log N)Θ (NログN)Θ(Nlog⁡N)\Theta(N \log N) アルゴリズムが複雑ななる方法は複数あると思いますので、ありとあらゆる答えがありがたいです。ところで、厳密な証拠ではなく、一般的な特性とヒントを探しています。Θ (NログN)Θ(Nlog⁡N)\Theta(N \log N)

5
Collat​​z再帰の実行時間
次のPythonコードがあります。 def collatz(n): if n <= 1: return True elif (n%2==0): return collatz(n/2) else: return collatz(3*n+1) このアルゴリズムの実行時間は? 試してください: 場合関数の実行時間を示します。そして、私は T(n)T(n)T(n)collatz(n)⎧⎩⎨T(n)=1 for n≤1T(n)=T(n/2) for n evenT(n)=T(3n+1) for n odd{T(n)=1 for n≤1T(n)=T(n/2) for n evenT(n)=T(3n+1) for n odd\begin{cases} T(n)=1 \text{ for } n\le 1\\ T(n)=T(n/2) \text{ for } n\text{ even}\\ T(n)=T(3n+1) \text{ …

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 | Σ …

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

2
難しいこと:並べ替えられたデッキをシャッフルするか、シャッフルされたデッキを並べ替えるのですか?
異なる要素の配列があります。あなたは(ブラックボックス関数は、2つの要素取るコンパレータへのアクセス権を持つとし、trueを返す)とビット真にランダムソース(ブラックボックス関数は、引数を取ることなく、独立して、均一にランダムビットを返します)。次の2つのタスクを検討してください。nnnaaabbba&lt;ba&lt;ba < b 配列は現在ソートされています。一様に(またはほぼ一様に)ランダムに選択された順列を生成します。 配列は、本質的にランダムに均一に選択されたいくつかの順列で構成されています。ソートされた配列を作成します。 私の質問は どのタスクが漸近的により多くのエネルギーを必要としますか? 情報理論、熱力学、またはこの質問に答えるために必要な他のものとの関係について十分に知らないため、質問をより正確に定義することはできません。しかし、質問は明確に定義できると思います(そして、誰かがこれで私を助けてくれることを願っています!)。 今、アルゴリズム的に、私の直感は、それらが等しいということです。すべての並べ替えは逆のシャッフルであり、逆もまた同様です。ソートにはが必要からランダムな順列を選択するため、シャッフル中の比較選択、が必要ランダムビット。シャッフルとソートの両方に、約スワップが必要です。logn!≈nlognlog⁡n!≈nlog⁡n\log n! \approx n \log nn!n!n!logn!≈nlognlog⁡n!≈nlog⁡n\log n! \approx n \log nnnn しかし、ランダウアーの原理を応用した答えが必要だと感じています。それは、少し「消す」ためにエネルギーが必要だと言っています。直感的に、これは配列のソートがより困難であることを意味すると思います。なぜなら、低エネルギー、高エントロピーの基底状態の乱れから高度に秩序化された状態への情報の「消去」ビットが必要だからです しかし一方で、任意の計算では、並べ替えは1つの順列を別の順列に変換するだけです。私はここでは完全な非専門家なので、物理学とのつながりを知っている人がこれを「分類」するのを手伝ってくれることを望んでいました!nlognnlog⁡nn \log n (質問はmath.seで回答を得られなかったので、ここに再投稿しています。それでいいのです。)

2
Randomized Quicksortの利点は何ですか?
本のRandomized Algorithmsで、 MotwaniとRaghavanは、RandQS関数(ランダム化クイックソート)の説明で導入部を開きます。ここでは、セットを2つの部分に分割するために使用されるピボットがランダムに選択されます。 私はこれまでに(明らかにやや劣っています)頭を悩ませてきましたが、このアルゴリズムが単に毎回(サイズではなくインデックス内の)要素を選択することに比べて、どのような利点があるのか​​わかりませんでした。 私が見ることができないのはこれだと思います:初期セットがランダムな順序である場合、セット内のランダムな場所で要素を選択することと固定位置で要素を選択することの違いは何ですか? 誰かがかなり単純な言葉で私を啓発できますか?

4
アルゴリズムの繰り返しと生成関数
コンビナトリクスは、コンピューターサイエンスで重要な役割を果たします。アルゴリズムの設計と設計の両方で、組み合わせ手法を頻繁に利用します。たとえば、グラフで頂点カバーセットを見つける方法の1つは、\ binom {n} {k}の可能なサブセットすべてを検査するだけです。二項関数は指数関数的に成長しますが、kが何らかの固定定数である場合、漸近解析による多項式時間アルゴリズムになります。kkk(nk)(nk)\binom{n}{k}kkk 多くの場合、現実の問題には、より複雑な組み合わせのメカニズムが必要であり、それを繰り返しの観点から定義することができます。有名な例の1つは、(単純に)次のように定義されたフィボナッチ数列です。 f(n)=⎧⎩⎨10f(n−1)+f(n−2)if n=1if n=0otherwisef(n)={1if n=10if n=0f(n−1)+f(n−2)otherwisef(n) = \begin{cases} 1 & \text{if } n = 1 \\ 0 & \text{if } n = 0 \\ f(n-1) + f(n-2) & \text{otherwise} \end{cases} nnn番目の項の値の計算は、この繰り返しを使用して指数関数的に増加しますが、動的プログラミングのおかげで、線形時間で計算できます。現在、すべての繰り返しがDP(オフハンド、階乗関数)に役立つわけではありませんが、カウントを生成関数ではなく繰り返しとして定義する場合、潜在的に悪用可能なプロパティです。 関数の生成は、特定の構造のカウントを形式化するエレガントな方法です。おそらく最も有名なのは、次のように定義された二項関数です。 (x+y)α=∑∞k=0(αk)xα−kyk(x+y)α=∑k=0∞(αk)xα−kyk(x + y)^\alpha = \sum_{k=0}^\infty \binom{\alpha}{k}x^{\alpha - k}y^k 幸いなことに、これには閉じた形式のソリューションがあります。すべての生成関数がこのようなコンパクトな記述を許可するわけではありません。 私の質問はこれです:アルゴリズムの設計で使用される関数を生成する頻度はどれくらいですか?分析によってアルゴリズムに必要な成長率を理解するためにそれらがどのように活用されるかは簡単にわかりますが、問題を解決する方法を作成するときに問題について教えてください。 同じカウントが何度も繰り返しとして再定式化される場合、動的プログラミングに役立つ可能性がありますが、おそらく同じ生成関数は閉じた形式になります。だから、それはそれほど均等にカットされていません。

4
Randomized QuicksortにO(n log n)のワーストケースランタイムコストがあるのはなぜですか
ランダムクイックソートは、ピボットエレメントがランダムに選択されるクイックソートの拡張機能です。このアルゴリズムの最悪の場合の時間の複雑さは何ですか。私によると、それがあるべきであるO(n2)O(n2)O(n^2)ランダムに選択されたピボットが選択される場合、最悪の場合に起こるように、ソートまたは逆ソート順序。しかし、いくつかのテキスト[1] [2]では、最悪の場合の時間の複雑さはO(nlogn)O(nlog⁡n)O(n\log{n}) 何が正しいの?

4
リンクリストでクイックソートを使用しないのはなぜですか?
クイックソートアルゴリズムは、次のステップに分けることができます ピボットを識別します。 ピボットに基づいてリンクリストをパーティション分割します。 リンクリストを再帰的に2つの部分に分割します。 ここで、最後の要素を常にピボットとして選択すると、ピボット要素(最初のステップ)の識別に時間かかります。O(n)O(n)\mathcal O(n) ピボット要素を特定したら、そのデータを保存し、他のすべての要素と比較して、正しいパーティションポイントを特定します(2番目のステップ)。ピボットデータを保存するため、各比較には時間かかり、各スワップにはO(1 )時間かかります。したがって、n個の要素に対して合計でO(n )時間かかります。O(1)O(1)\mathcal O(1)O(1)O(1)\mathcal O(1)O(n)O(n)\mathcal O(n)nnn したがって、再帰関係は次のとおりです。 は O(n log n )です。これは、リンクリストを使用したマージソートと同じです。T(n)=2T(n/2)+nT(n)=2T(n/2)+nT(n) = 2T(n/2) + nO(nlogn)O(nlog⁡n)\mathcal O(n \log n) それでは、なぜリンクリストのクイックソートよりもマージソートが優先されるのでしょうか。

1
ブルートフォースドローネ三角形分割アルゴリズムの複雑
Mark de Berg等の著書「Computational Geometry:Algorithms and Applications」には、ドロネー三角形分割を計算するための非常に単純なブルートフォースアルゴリズムがあります。このアルゴリズムは、無効なエッジの概念を使用します。有効なドローネ三角形分割では表示されず、他のエッジに置き換える必要があるエッジです。各ステップで、アルゴリズムはこれらの不正なエッジを検出し、不正なエッジがなくなるまで必要な変位(エッジフリップと呼ばれる)を実行します。 アルゴリズムLegalTriangulation(TTT) 入力。いくつかの三角TTT点セットのPPP。 出力。法的三角形分割PPP。 一方、 違法なエッジが含まれているP I 、P jの DOTTTpipjpipjp_ip_j \quadしてみましょうとP I 、P J P lは隣接する2つの三角形ことのp のi のp J。pipjpkpipjpkp_i p_j p_kpipjplpipjplp_i p_j p_lpipjpipjp_ip_j \quadTから削除し、代わりにp k p lを追加します。Tを返します。pipjpipjp_ip_jTTTpkplpkplp_kp_l TTT このアルゴリズムは最悪の場合O(n2)O(n2)O(n^2)時間で実行されると聞きました。ただし、この記述が正しいかどうかは明確ではありません。はいの場合、この上限をどのように証明できますか?

4
クイックソートが子供に説明しました
昨年、私は「幼稚園のための量子力学」に関する素晴らしい論文を読んでいました。簡単な紙ではありませんでした。 今、私は可能な限り簡単な言葉でクイックソートを説明する方法を疑問に思います。平均複雑度がであることを(または少なくとも手波で)どのように証明できますか?または少なくとも小学校では?O(nlogn)O(nlog⁡n)O(n \log n)

2
ヒープ
おそらく、この質問は以前に聞かれます。CLRS(2nd Ed)problem 6.5-8からのものです- 得マージに時間アルゴリズムをK 1つのソートされたリストの中にリストをソートし、N、すべての入力リスト内の要素の総数です。(ヒント:k方向のマージには最小ヒープを使用します。)O(nlgk)O(nlg⁡k)O(n \lg k)kkknnnkkk あるとしてリストをソートし、合計n個の値、私たちはそれぞれのリストが含まれていると仮定しましょうn個kkknnn番号、また各リストのは、厳密に昇順にソートされ、そして結果はまた、昇順に格納されます。nknk\frac{n}{k} 私の擬似コードはこのように見えます- list[k] ; k sorted lists heap[k] ; an auxiliary array to hold the min-heap result[n] ; array to store the sorted list for i := 1 to k ; O(k) do heap[i] := GET-MIN(list[i]) ; pick the first element ; and …

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