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

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

2
DFSがスペースの複雑さを持っていると見なされるのはなぜですか?
これらのメモによると、DFSは空間の複雑さを持っていると見なされます。ここで、はツリーの分岐係数であり、は状態空間内のパスの最大長です。b mO (b m )O(bm)O(bm)bbbメートルmm 同じことが、Uninformed SearchのこのWikibookページでも述べられています。 現在、DFSに関するWikipediaの記事の「情報ボックス」は、アルゴリズムのスペースの複雑さについて次のことを示しています。 O ()O (| V| )O(|V|)O(|V|)、繰り返しなしでグラフ全体をトラバースする場合、重複ノードを排除せずに、暗黙的グラフの検索された最長経路長O (O(O())) これは、DFSのスペースの複雑さ、つまりであると私が考えたものにより似ています。ここで、はアルゴリズムが到達する最大長です。mO(m)O(m)O(m)mmm なぜこれが事実だと思いますか? まあ、基本的には、現在見ているパスのノード以外のノードを保存する必要はないので、Wikibookと私が紹介したメモの両方が提供する分析でを掛けても意味がありません。に。bbb さらに、Richard KorfによるIDA *に関するこの論文によると、DFSのスペースの複雑さはであり、は「深度カットオフ」と見なされます。dO(d)O(d)O(d)ddd では、DFSの正しいスペースの複雑さは何ですか? それは実装に依存すると思うので、異なる既知の実装のスペースの複雑さの説明をいただければ幸いです。

2
ランタイムを実験的に比較するための標準はありますか?
私の状況 私が開発したソフトウェアモジュールを紹介する論文を書いており、そのランタイムを同じタスクの他のモジュールと比較したいと思います。ランタイムテストの欠点を認識していますが、私の場合は回避策がないと考えてください。(私は理論的にいくつかの特性を推定することができますが、それだけでは十分ではありません。) ベンチマークに使用したい特定のシナリオには、2つのパラメーターがあります。問題の複雑度 と、詳細な問題を決定するランダムシード です。主に私はへの依存を示したいです 。予備調査と理論によると、ランタイムへのの影響は小さいか無視できます。1つのタスクが完了するまでに最大で10分かかります。んんnrrrんんnrrr 実際の質問 私は、そのような実験を実行する上で一般的に受け入れられているか公開されている手順、または少なくとも一般的な落とし穴のリスト(理想的には公開)を探しています。 これまでに見つけたもの 何もない。インターネット検索は、あらゆる種類の無関係な結果を表示しますが、その場合、正しい用語を使用していない可能性があります。私が良い基準であることがわかっているキーワードの最小値を含めること(下記を参照)も役に立ちませんでした。 どうやってやるの すべての実験を、GUIなどの干渉する可能性のあるソフトウェアを可能な限り無効にして、同じマシンで実行します。 すべてのモジュールに同じ選択シナリオ、つまり同じおよび ます。んんnrrr シナリオごとに、さまざまなモジュールをランダムな順序で直接続けてテストします。つまり、さまざまなモジュールのループが最も内側のループです。これにより、マシンのパフォーマンスのゆるやかな変動(温度変化など)によるさまざまなモジュールへのバイアスを回避できます。ランダムな順序は、キャッシュや、同じモジュールの後に常にテストされる1つのモジュールなどの影響によるバイアスを回避する必要があります。 各について、ベンチマークとして異なるシードを使用して、いくつかのシナリオで最小ランタイムを取得します。これにより、マシンのパフォーマンスが短時間変動して、個々の実行が非常に悪くなるため、さまざまなモジュールへのバイアスが回避されます。んんn

1
最長のフィボナッチ部分文字列を見つけるための単純なアルゴリズムの複雑さ
2つの記号と与えられた場合、番目のフィボナッチ文字列を次のように定義してみましょう:aa\text{a}bb\text{b}kkk F(k)=⎧⎩⎨baF(k−1)⋆F(k−2)if k=0if k=1elseF(k)={bif k=0aif k=1F(k−1)⋆F(k−2)else F(k) = \begin{cases} \text{b} &\mbox{if } k = 0 \\ \text{a} &\mbox{if } k = 1 \\ F(k-1) \star F(k-2) &\mbox{else} \end{cases} 文字列の連結を示します。⋆⋆\star したがって、次のようになります。 F(0)=bF(0)=bF(0) = \text{b} F(1)=aF(1)=aF(1) = \text{a} F(2)=F(1)⋆F(0)=abF(2)=F(1)⋆F(0)=abF(2) = F(1) \star F(0) = \text{ab} F(3)=F(2)⋆F(1)=abaF(3)=F(2)⋆F(1)=abaF(3) = F(2) \star F(1) = \text{aba} …

1
敵対的な引数を使用してk番目に小さい要素を見つけるための下限
多くのテキストでは、中央値を使用する引数を使用して、番目に小さい要素を見つけるための下限が導出されます。敵対的な議論を使用してどのように見つけることができますか?kkk ウィキペディアによると、トーナメントアルゴリズムはで実行され、は下限として与えられます。N - K + Σ N J = N + 2 - K ⌈ LGO(n+klogn)O(n+klog⁡n)O(n+k\log n)N - K + Σんj = n + 2 − k⌈ LGJ ⌉n−k+∑j=n+2−kn⌈lgj⌉n - k + \sum_{j = n+2-k}^{n} \lceil{\operatorname{lg}\, j}\rceil

1
関数型プログラミング言語の実装に関するアルゴリズムの複雑さの分析
今日、アルゴリズム分析は計算モデルに基づいて異なることを学びました。それは私が考えも聞いたこともないものです。 User @chiが私に与えた、それをさらに説明する例は次のとおりです。 たとえば、タスクを考えてみましょう: がx iを返し ます。RAM では 、配列アクセスが一定時間であるため、これはO (1 )で解決できます。TMを使用して、入力全体をスキャンする必要があるため、O (n )です。(i,x1,…,xn)(i,x1,…,xn)(i,x_1 ,…,x_n )xixix_iO(1)O(1)O(1)O(n)O(n)O(n) これは、関数型言語について不思議に思います。私の理解から、「関数型言語はラムダ計算に密接に関連しています」(ここでの Yuval Filmusのコメントから)。では、関数型言語がラムダ計算に基づいているが、RAMベースのマシンで実行されている場合、純粋に関数型のデータ構造と言語を使用して実装されたアルゴリズムで複雑さ分析を実行する適切な方法は何ですか? 私は純粋に機能的なデータ構造を読む機会がありませんでしたが、件名についてWikipediaのページを確認しました。データ構造のいくつかは、従来の配列を次のものに置き換えているようです。 「配列は、純粋に機能的な実装を認めるマップまたはランダムアクセスリストに置き換えることができますが、アクセスと更新の時間は対数です。」 その場合、計算モデルは異なりますよね?

4
アルゴリズムの自動ランタイム分析の方法はありますか?
私は疑問に思っています、少なくともアルゴリズムの関連するサブセット(分析可能なアルゴリズム)で機能する自動ランタイム分析の方法はありますか? 私は私に与えた「自動アルゴリズム分析」ググこれを、それはあまりにもMathyさんです。私が理解できるpsuedocodeの簡単な例が欲しいだけです。具体的すぎるかもしれませんが、一見の価値があると思いました。

1
このアルゴリズムが最終的に終了することを証明する簡単な方法
導入と表記: (私の実験によれば)終了するように見える私のアルゴリズムの新しくてシンプルなバージョンがここにあります、そして今私はそれを証明したいと思います。 表記ましょを参照して、P次元データ点(ベクトル)。A、B、Cの3つのセットがあります。A | = n、| B | = m、| C | = l: A = { x i | 私は= 1 、。。、n } B = { x j | j = n + 1xi∈Rpxi∈Rpx_i \in \mathbb{R}^pppp|A|=n|A|=n|A| = n|B|=m|B|=m|B| = m|C|=l|C|=l|C| = lA={xi|i=1,..,n}A={xi|i=1,..,n}A = \{x_i | i = 1, .., …


3
ワトソン・クリックの回文を認識するスペースの複雑さ
次のアルゴリズムの問​​題があります。 Watson-Crickの回文であるDNA文字列を認識する複雑な空間チューリングを決定します。 Watson-Crickパリンドロームは、元のストリングが逆補数のストリングです。補体は、 DNAに触発、文字ごとに定義される:AはTの補数であり、Cは、ACGT WC-ドロームためG. Aの単純な例の補数です。 これを解決するには2つの方法があります。 1つはスペースを必要とします。O(n)O(n)\mathcal{O}(n) 機械が完了したら、入力を読み取ります。入力テープは、逆の順序でワークテープにコピーする必要があります。 次に、マシンは入力とワークテープを左から読み取り、各エントリを比較して、ワークテープのセルが入力のセルの補数であることを確認します。これにはスペースが必要です。O(n)O(n)\mathcal{O}(n) もう1つにはスペースが必要です。O(logn)O(log⁡n)\mathcal{O}(\log n) 入力の読み取り中。入力テープのエントリ数をカウントします。 入力テープが読み終わったら 文字の補数を作業テープにコピーします 文字Lを作業テープの最後にコピーします (ループポイント)カウンター= 0の場合、ワークテープをクリアして「yes」と書き込み、停止します 入力テープがLを読み取る場合 カウンターで示された回数だけ入力ヘッドを左に移動します(2番目のカウンターが必要)。 入力テープがRを読み取る場合 カウンターで示された回数だけ入力ヘッドを右に移動します(2番目のカウンターが必要)。 ワークテープの値を保持するセルが入力テープの現在のセルと一致する場合 カウンターを2減分する RまたはLがそれぞれワークテープにあるかどうかに応じて、1つを左または右に移動します。 LまたはRの補数を現在のLまたはRの代わりにワークテープにコピーする ループを続ける 値が一致しない場合は、ワークテープをクリアして「いいえ」と書き込み、停止します 2logn+22log⁡n+22\log n+2 私の問題 最初のものは線形時間と空間の両方を必要とします。2番目にはが必要ですn22n22\frac{n^2}{2}lognlog⁡n\log n 私が混乱している理由 2番目の方法は時間の点で優れているので、2番目の方法が最良の選択肢であると思う傾向がありますが、その答えは私が幸運になってアルゴリズムを考え出すことによってのみ得られます。スペースに複雑さを与えたいのであれば、正しいアルゴリズムを思いつくのに運は必要ないようです。何か不足していますか?スペースの複雑さを解決するための問題の解決策を考え出す必要さえありますか?

1
2つの再帰呼び出しによる再帰関係の解決
私はそれは決してしないだろうという条件の下でクイックソートの最悪のランタイムを勉強して、非常の定義を変更するためのアンバランスパーティションを非常に。 これを行うために、私は自分自身に、ランタイム何質問をクイックソート常にそうになりますが、いくつかの画分にパーティションに起こるよう要素は左側のパーティションにあり、は右側のパーティションにあります(要素、ピボット、中央に残ります)。T(n,p)T(n,p)T(n, p)0&lt;p≤120&lt;p≤120 < p \leq {1\over 2}⌊p(n−1)⌋⌊p(n−1)⌋\lfloor{p(n-1)}\rfloor⌈(1−p)(n−1)⌉⌈(1−p)(n−1)⌉\lceil(1 - p)(n - 1)\rceil111 が最悪の場合の上限を与えることを確認することは難しくありません。ここで、は最大不均衡許容パーティションです。フラクションパーティションはよりバランスがとれており、実行時間が短くなります。端数許可されていません。T(n,p)T(n,p)T(n, p)ppp&gt;p&gt;p> p&lt;p&lt;p<p が最良のケースであり、がクイックソートの最悪のケースであることは明らかです。どちらにも、あらゆる教育リソースで見られる簡単な再発関係があります。しかし、私はを一般的にどのように研究するかについての手がかりはありません。明らかな関係は次のとおりです。T(n,12)T(n,12)T(n, {1 \over 2})T(n,0)T(n,0)T(n, 0)T(n,p)T(n,p)T(n, p) T(n,p)=n+T(⌊p(n−1)⌋,p)+T(⌈(1−p)(n−1)⌉,p)T(n,p)=n+T(⌊p(n−1)⌋,p)+T(⌈(1−p)(n−1)⌉,p)T(n, p) = n + T(\lfloor{p(n-1)}\rfloor, p) + T(\lceil(1 - p)(n - 1)\rceil, p) ここで行き詰まっています。私は周りを検索してみましたが、分割統治アルゴリズムについて理解できるすべての文献は、文字通り「分割」を行い、パーティションのサイズが常に等しいという事実を使用して分析を「だまし」、用語を1回にマージしました。絶え間ない。 2つの再帰呼び出しを処理する方法がわかりません。丸めを削除しても安全かどうかはわかりません。これは分析的に解決することは可能ですか?はいの場合、どのように? PS:私は漸近論には興味がありません(定数に対してを示すのは簡単です)。が小さくなるにつれて、クイックソートがどのくらい遅くなるかに興味があります。たとえば、の比率に興味があります。p p T (n 、0.25 )Θ(nlogn)Θ(nlog⁡n)\Theta(n \log n)ppppppT(n,0.25)T(n,0.5)T(n,0.25)T(n,0.5)T(n, 0.25) \over T(n, 0.5) PPS:学部生として、明白なことを長くしすぎたり、説明が不十分であったりすれば、すさまじいことをお詫びします。ここで他のSEサイトほど見下されているかどうかはわかりませんが、これは宿題ではなく個人的な関心事であることに注意します。

1
この関数が
私の教科書は言う:「我々は、関数定義f:N→Nf:N→Nf\colon \mathbb{N}\to\mathbb{N}次のように及び注意を与えていること、我々時間でがと間に挟まれるような数を簡単に見つけることができます。 "f(1)=2f(1)=2f(1)=2f(i+1)=2f(i)1.2f(i+1)=2f(i)1.2f(i+1)=2^{f(i)^{1.2}}nnnO(n1.5)O(n1.5)O(n^{1.5})iiinnnf(i)f(i)f(i)f(i+1)f(i+1)f(i+1) 実際に簡単に時間でを見つけることができると自分に納得させるにはどうすればよいですか?再帰的に定義され、私たちは計算にあると思うまでの。これらの計算にかかる時間を見つけるには、依存する適切な上限を見つける必要があると思います。また、関数の実行時間の上限を見つける必要があります。。最後に、うまくいけば引用された命題を示すことができます。残念ながら、どちらも見えません。iiiO(n1.5)O(n1.5)O(n^{1.5})ffff(1),f(2),f(3)…f(j)f(1),f(2),f(3)…f(j)f(1),f(2),f(3)\dots f(j)f(j)≥nf(j)≥nf(j)\geq niiinnnx→2x1.2x→2x1.2x\to2^{x^{1.2}} 私が言及するのを忘れていました:私たちは非決定的なコンテキストにいることに注意してください。したがって、はで非決定性チューリングマシンによって計算可能であると主張されています。fffO(n1.5)O(n1.5)O(n^{1.5}) かなりの数の人がすでにこの質問を読んでおり、一部の人もそれが有用で興味深いと感じていますが、今のところ誰も回答していないので、私はコンテキストについていくつかの情報を提供したいと思います:引用された主張は証拠の不可欠な部分です非決定論的な時間階層定理。証明(主張付き)は、たとえばAroraとBarakの本にありますが、同じ証明を提供するWeb上の他のリソースもかなりたくさん見つかりました。それらのそれぞれは、クレームを簡単または些細なものと呼んでおり、を見つける方法については詳しく説明していませんiii時間で。したがって、これらすべてのリソースがAroraとBarakからコピーされたか、その主張は実際にはそれほど難しくありません。O(n1.5)O(n1.5)O(n^{1.5})

1
幅優先検索が時間実行されると言うのはなぜですか?
グラフの幅優先検索(BFS)の実行時間はO(| V | + | E |)であると(Wikipediaなどで)よく言われます。ただし、接続されたグラフには| V | \ leq | E | +1があり、接続されていないグラフであっても、BFSは開始頂点を含むコンポーネントの外側の頂点を決して見ません。そのコンポーネントには最大で| E |が含まれます エッジなので、最大で| E | +1個の頂点が含まれ、それらの頂点のみがアルゴリズムがアクセスします。G=(V,E)G=(V,E)G=(V,E)O(|V|+|E|)O(|V|+|E|)O(|V|+|E|)|V|≤|E|+1|V|≤|E|+1|V|\leq |E|+1|E||E||E||E|+1|E|+1|E|+1 これは、|V|+|E|≤2|E|+1|V|+|E|≤2|E|+1|V|+|E|\leq 2|E|+1であることを意味するので、実行時間はO(|E|)O(|E|)O(|E|)だけであると言ってみませんか? これは、Disjkstraのアルゴリズムの実行時間に関する質問へのコメントで生じました。

1
最大化する方法
私は常にアルゴリズムの問​​題をたくさん見ています。それは常に次のような長い行に還元されます。 あなたが持っている整数配列の、あなたは見つける必要がある、このような最大化するで時間。h[1..n]≥0h[1..n]≥0h[1..n]\geq 0i,ji,ji,j(h[j]−h[i])(j−i)(h[j]−h[i])(j−i)(h[j]-h[i])(j-i)O(n)O(n)O(n) 明らかに時間解はすべてのペアを考慮することですが、プロパティについて他に何も知らなくても式を最大化できる方法はありますか?O(n2)O(n2)O(n^2)O(n)O(n)O(n)hhh 私が考えた1つのアイデアはを修正することです。それから、等しいからまでのを見つける必要がありますまたはあり、が固定されているため、。jjji∗i∗i^*111j−1j−1j-1argmaxi{ (h [j]−h[i])(j−i)}argmaxi{(h[j]−h[i])(j−i)}\text{argmax}_i\{(h[j]-h[i])(j-i)\}argmaxi{ h [ j ] j - h [ j ] i - h [ i ] j + h [ i ] i }argmaxi{h[j]j−h[j]私−h[私]j+h[私]私}\text{argmax}_i\{h[j]j-h[j]i-h[i]j+h[i]i\}jjjargmax私{ − h [ j ] i − j h [ i ] + i h [ i ] }argmax私{−h[j]私−jh[私]+私h[私]}\text{argmax}_i\{-h[j]i-jh[i]+ih[i]\} …

1
ランダム化された溶融可能なヒープ-期待される高さ
ランダム化された融合可能なヒープには操作「meld」があり、それを使用して、挿入を含む他のすべての操作を定義します。 問題は、ノードを持つツリーの予想される高さは何ですか?nnn Gambin and Malinkowskiの定理1、ランダム化された融合可能な優先キュー(Proceedings of SOFSEM 1998、Lecture Notes in Computer Science vol。1521、pp。344–349、1998; PDF)は、この質問に対する答えを証明とともに示しています。しかし、なぜ書き込めるかはわかりません: E[hQ]=12((1+E[hQL])+(1+E[hQR])).E[hQ]=12((1+E[hQL])+(1+E[hQR])).\mathbb{E} [ h_Q] = \frac{1}{2} ((1 + \mathbb{E}[h_{Q_L}]) + (1 + \mathbb{E}[h_{Q_R}]))\,. 私にとって木の高さは hQ=1+max{hQL,hQR},hQ=1+max{hQL,hQR},h_Q = 1 + \max\, \{ h_{Q_L}, h_{Q_R}\}\,, これは次のように拡張できます。 E[hQ]=1+E[max{hQL,hQR}]=1+∑kP[max{hQL,hQR}=k].E[hQ]=1+E[max{hQL,hQR}]=1+∑kP[max{hQL,hQR}=k].\mathbb{E} [ h_Q] = 1 + \mathbb{E}[\max \,\{ h_{Q_L}, h_{Q_R}\}] = 1 + \sum …

1
なぜイントロソートはマージソートではなくヒープソートを使用するのですか?
イントロソートの実装をカバーする宿題の一環として、なぜマージソート(または他のアルゴリズムではなく)の代わりにヒープソートが使用されるのかを尋ねられます。 O(nlog(n))O(nlog⁡(n))O(n\log(n)) Introsortは、高速な平均パフォーマンスと(漸近的に)最適な最悪のケースのパフォーマンスの両方を提供するハイブリッドソートアルゴリズムです。クイックソートで始まり、再帰の深さがソートされる要素の数(の対数)に基づくレベルを超えると、ヒープソートに切り替わります。(ウィキペディア、2014年5月6日取得。) 私が考えることができる唯一の理由は、ヒープソートが「適所に」あるということです...しかし、これがなぜここで重要になるのかは本当にわかりません。

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