実行方法に応じて、4つの一般的な大きなO 時間の複雑さを示すプログラム(または関数)を作成します。どのような形式でも、正の整数Nを取りますが、これは2 31より小さいと仮定できます。
プログラムを元の形式で実行する場合、一定の複雑さが必要です。つまり、複雑度はΘ(1)または同等にΘ(1 ^ N)でなければなりません。
プログラムを反転して実行すると、線形の複雑さが生じるはずです。つまり、複雑さはΘ(N)または同等にΘ(N ^ 1)でなければなりません。
(これN^1
は1^N
逆になっているので理にかなっています。)プログラムが2倍になった場合、つまり、プログラム自体に連結されて実行される場合、指数関数的な複雑さ、特に2 Nが必要です。つまり、複雑さはΘ(2 ^ N)でなければなりません。
(ので、これは理にかなっている2
では2^N
二重のある1
中1^N
)。プログラムを2倍にして反転して実行すると、多項式の複雑さ、特にN 2が必要になります。つまり、複雑さはΘ(N ^ 2)でなければなりません。
(これN^2
は2^N
逆になっているので理にかなっています。)
これらの4つのケースは、処理する必要がある唯一のケースです。
プログラムの実行時間は必要な複雑さによって上下に制限される必要があるため、正確さのために、大きなOではなく大きなシータ(Θ)表記を使用していることに注意してください。それ以外の場合、O(1)で関数を記述するだけで、4つのポイントがすべて満たされます。ここでニュアンスを理解することはそれほど重要ではありません。主に、プログラムが定数kに対してk * f(N)操作を実行している場合、Θ(f(N))にある可能性があります。
例
元のプログラムが
ABCDE
実行には一定の時間がかかります。つまり、入力Nが1でも2147483647(2 31 -1)でも、その間の値でも、ほぼ同じ時間で終了するはずです。
プログラムの逆バージョン
EDCBA
つまり、終了にかかる時間はNにほぼ比例する必要があります。したがって、N = 1が最も時間がかかり、N = 2147483647が最も時間がかかります。
プログラムの倍増バージョン
ABCDEABCDE
Nに関して2からN時間かかるはずです。つまり、終了するのに要する時間は2 Nにほぼ比例するはずです。したがって、N = 1が約1秒で終了する場合、N = 60は宇宙の年齢よりも長い時間がかかります。(いいえ、テストする必要はありません。)
プログラムの二重化および反転バージョン
EDCBAEDCBA
つまり、終了にかかる時間は、N * Nにほぼ比例するはずです。したがって、N = 1が約1秒で終了する場合、N = 60は終了するのに約1時間かかります。
詳細
あなたは、あなたが言っている複雑さの中でプログラムが実行されていることを示すか、議論する必要があります。いくつかのタイミングデータを提供することは良い考えですが、理論的に複雑さが正しい理由を説明しようとします。
実際にあなたのプログラムにかかる時間が複雑さを完全に表していない(あるいは決定論的でさえある)のであれば問題ありません。たとえば、入力N + 1はNよりも高速に実行される場合があります。
プログラムを実行している環境は重要です。人気のある言語がアルゴリズムで意図的に時間を浪費することは決してないという基本的な仮定を立てることができますが、たとえば、特定のバージョンのJava がより高速なソートアルゴリズムの代わりにバブルソートを実装していることがわかっている場合、ソートを行う場合はそれを考慮する必要があります。
ここでのすべての複雑さについて、ベストケースや平均ケースではなく、最悪ケースのシナリオについて話していると仮定します。
プログラムのスペースの複雑さは重要ではなく、時間の複雑さだけが重要です。
プログラムは何でも出力できます。彼らが正の整数Nを取り、正しい時間の複雑さを持っていることが重要です。
コメントと複数行のプログラムが許可されています。(
\r\n
逆になっているの\r\n
はWindowsとの互換性であると思われるかもしれません。)
ビッグOリマインダー
最速から最速までO(1), O(N), O(N^2), O(2^N)
(上記の順序1、2、4、3 )。
遅い用語は常に優勢O(2^N + N^2 + N) = O(2^N)
です。
O(k*f(N)) = O(f(N))
定数kの場合。だから、O(2) = O(30) = O(1)
とO(2*N) = O(0.1*N) = O(N)
。
覚えておいてくださいO(N^2) != O(N^3)
とO(2^N) != O(3^N)
。
得点
これは通常のコードゴルフです。バイト単位の最短オリジナルプログラム(一定時間のもの)が勝ちます。
n = input(); for i in xrange(n): pass
は指数関数的に複雑になります。これは、入力サイズ2 ** k
がどこにk = log_2(n)
あるかによってステップがとられるためです。要件が劇的に変わるため、これが当てはまるかどうかを明確にする必要があります。