ランタイム分析の時間の1単位を構成するものは何ですか?


8

入力に対する実行時の依存関係を計算するとき、どのような計算が考慮されますか?たとえば、配列のインデックスと割り当てステートメントがカウントされないことを学んだと思いますが、それはなぜですか?

回答:


6

複雑さの計算を行う場合、通常はRAMモデルを使用します。このモデルで、配列のインデックスがO(1)であると想定しています。代入文は、変数の配列 insに変数を代入するのと同じです。これは便宜上のものです。アルゴリズムの分析を簡素化します。現実の世界では、配列のインデックス付けには(log I)が必要です。ここで、Iはインデックス付けされるものの数です。

通常、ループなど、入力のサイズに依存するものを考慮します。ループ内にO(1)演算があり、それがn回実行される場合でも、アルゴリズムはO(n)時間実行されます。

しかし、ループの外のO(1)操作は一定の時間のみを必要とし、O(n)+ O(1)= O(n)です。

CLRSから基数ソートアルゴリズムについて読んでください。


ループの増分についてはどうですか?それらはO(n)である必要がありますか?

for(int k = 0; k <N; k ++){sum = sum + values [k];}は問題のコードです。3N + 2の呼び出しを行うと言われていました。

いいえ。sum = sum + values [k]の場合、+はO(1)であり、=もO(1)です。しかし、ループはO(N)回実行されます。したがって、そのO(N)* O(1 + 1)= O(N)です。O(3N + 2)呼び出しはO(N)です。
Pratik Deoghare 2013

しかし、なぜO(3N + 2)呼び出しなのでしょうか。

value [k]へのアクセスは1回の呼び出しです。+は1コールです。=は1コールです。これは、N回行われた3つの呼び出しを説明しますが、+ 2については知りません。
Pratik Deoghare 2013

5

最終的な目標は、「秒単位の実行時間」、またはより一般的には(最新のCPU機能を無視して)「クロックサイクル数」です。結局のところ、これは分析するのが難しく、また、マシンまたは少なくとも命令セットに固有のものです。したがって、通常は行われません。

次のレベルの抽象化は、(いくつかのアセンブリスタイルの疑似コードの)すべての操作を正確にカウントし、個々の操作コスト(クロックサイクル)をパラメーターとして保持することです。このような分析は、とりわけ、Knuthの「The Art of Computer Programming」に見られるため、メモリ階層が存在する場合は困難であり、困難になる傾向がありますが、この種のアプローチの場所は確かにあります。

O

「クラシック」フレームワークを残して、多くのアルゴリズムはメモリおよび/または通信コストによって支配されるため、その場合、メモリの数とボリュームのカウントはそれぞれにアクセスします。ネットワーク送信は妥当です(そしておそらく十分です)。

さらに、多くの場合、アルゴリズムの絶対的なパフォーマンスではなく、他のアルゴリズムと比較することに関心があることに注意してください。これも、分析されたパラメータの選択を通知する場合があります。

ご覧のとおり、明確な答えはありません。手元の分析の目的に応じて、異なる答えを出すことができます。

いくつかの関連する考えについては、ここでの私の回答と、例としてのQuicksortに関するSebastianの回答も参照してください。


あなたが言及している最も顕著なアプローチは完全にRAMモデルでカバーされていると言って満足していません:RAMモデルは通常、乗算の均一なコストを考慮していません(問題のあるポリタイムでTMが解決できる問題の同等性を維持するため) RAMによってポリタイムで解決可能)。ただし、乗算は通常、多くのアルゴリズムの分析において一定の時間を要すると想定されています
Cornelius Brand

@cbra:乗算以外のすべてについて均一なコストのRAMモデルに出会ったことはありません。特に、ポリタイム等価性の場合は必要ありません。
ラファエル

2(2n)O(n)

@cbraそこにポイントがあるようです。「純粋な」形式のRAMモデルは、アトミックアクションとして乗算を提供しませんが、繰り返し追加することでそれを実装します。したがって、乗算(および場合によっては他の演算)の均一なコストは、数が大きくなる(つまり、入力(?)より大きくなる)問題に適用されると特定の関係を壊すという点で「危険」です。
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.