したがって、次のプログラムがあるとします。
このプログラムの時間の複雑さはO(0)ですか?つまり、0 O(0)ですか?
別の質問でこれに答えると、 この質問 に光が当てられると思いました。
編集:ここにたくさんの良い答えがあります! 0はO(1)であることに同意します。問題は、0 O(0)も同様ですか?
Wikipedia から:
ビッグO表記による関数の説明は、通常、関数の成長率の上限のみを提供します。
この説明から、空のアルゴリズムは実行に0時間を必要とするため、上限のパフォーマンスはO(0)になります。つまり、これはO(1)でもあり、たまたま上限が大きくなっています。
編集する:
より正式にはCLR(1ed、pg 26)から:
特定の関数について g(ん)、私たちは O(g(ん))関数のセット
O(g(ん))= { f(ん):正の定数が存在します c そして ん 0≤f(n)≤ cg(ん) すべてのために ん ≥ ん }
したがって、入力に関係なく0時間で実行される空のアルゴリズムの漸近時間パフォーマンスは、 O(0)。
編集2:
0はO(1)であることに私たちは皆同意します。問題は、0 O(0)も同様ですか?
定義に基づいて、私はイエスと言います。
さらに、多くの回答が示すよりも、質問にはもう少し重要性があると思います。それだけでは、空のアルゴリズムはおそらく無意味です。ただし、自明ではないアルゴリズムが指定されている場合、空のアルゴリズムは、指定されているアルゴリズムの連続するステップの間、およびアルゴリズムのステップの前後にあると考えることができます。 「無」がアルゴリズムの漸近時間パフォーマンスに影響を与えないことを知っておくのはうれしいことです。
編集3:
Adam Crume は次のようになります claim :
どんな機能にも f(バツ)、 f(バツ)はO(f(バツ))。
証明:しましょう S のサブセットになる R そして T のサブセットになる R* (非負の実数)そして f(バツ):S ->T そして c ≥1.次に0≤ f(バツ)≤ f(バツ)0≤ f(バツ)≤ cf(バツ)すべてのx∈S。したがって f(バツ)∈O(f(バツ))。
具体的には、 f(バツ)= 0の場合 f(バツ)∈O(0)。
入力に関係なく実行に同じ時間がかかるため、定義によりO(1)となります。
いくつかの答えは、複雑さはO(1)であるためです。これは、時間が一定であり、時間はある係数と1の積によって制限されるためです。まあ、時間はa定数であり、そのように制限されていますが、それが最良の答えがO(1)であることを意味するものではありません。
線形時間で実行されるアルゴリズムを考えます。通常、O(n)と指定されますが、悪魔の支持者を演じましょう。時間は、ある係数とn ^ 2の積によって制限されます。O(n ^ 2)をセット、つまり複雑さが十分に小さいすべてのアルゴリズムのセット。線形アルゴリズムはそのセットに含まれますが、最良の答えがO(n ^ 2)であるとは限りません。
空のアルゴリズムはO(n ^ 2)とO(n)とO(1)とO(0)にあります。私は投票します。 O(0)の場合。
空のアルゴリズムがO(0)であるという非常に単純な引数があります。任意の関数f(x)の場合、f(x)はO(f(x)にあります)。単純にf (x)= 0で、0(空のアルゴリズムのランタイム)がO(0)にあることがわかります。
余談ですが、f(x) = O(g(x))と書くとき、私はそれを嫌います。f(x) ∈O(g(x))。
Big Oは漸近表記です。ビッグOを使用するには、関数が必要です。つまり、nが使用されていない場合でも、式はnでパラメーター化する必要があります。 5という数がO(n)であると言っても意味がありません。定数関数f(n) = 5がO(n)です。
したがって、時間の複雑さをビッグOで分析するには、nの関数が必要です。あなたのアルゴリズムは常に間違いなく0ステップを実行しますが、漸近的振る舞いについて話す変動パラメーターがないと意味がありません。アルゴリズムがnでパラメーター化されていると仮定します。今だけ漸近表記を使用できます。 O(n2)、またはO(1)、さらにn(またはO(1)に隠された変数)を指定しない場合!
ステップ数が決まったら、ビッグOの定義の問題です。関数f(n) = 0はO(0)です。
これは低レベルの質問なので、計算モデルに依存します。 「理想的」な仮定の下では、何もしないことが可能です。しかし、Pythonではdef f(x):
とは言えませんが、def f(x): pass
としか言えません。 pass
(NOP)であってもすべての命令に時間がかかると仮定すると、複雑さはf(n) = cであり、定数cに対して、c != 0
f
はO(1)であり、O(0)ではないと言えるだけです。
大きなO自体はアルゴリズムとは何の関係もないことに注意してください。たとえば、sin x = x + O(x3)テイラー展開について議論するとき。また、O(1)は定数を意味するのではなく、定数によって制限されることを意味します。
これまでのすべての回答は、正解と不正解があるかのように質問に対応しています。しかし、ありません。問題は定義の問題です。通常、複雑性理論では、時間コストは整数です---それも単なる定義です。すぐに終了する空のアルゴリズムには、0タイムステップまたは1タイムステップかかると言ってもかまいません。時間の複雑さは抽象的な定義なので、これは抽象的な質問です。現実の世界では、タイムステップすらなく、継続的な物理的な時間があります。 1つのCPUにクロックサイクルがあることは事実ですが、並列コンピューターは非同期クロックを簡単に持つことができ、いずれの場合でもクロックサイクルは非常に小さいです。
とはいえ、停止操作は0タイムステップではなく、1タイムステップであると言う方が合理的だと思います。より現実的に見えます。初期化のオーバーヘッドは通常、1つの算術演算または論理演算を実行するよりもはるかに大きいため、多くの状況では、それは間違いなく非常に保守的です。空のアルゴリズムに0のタイムステップを与えることは、たとえば、関数が何もしないことを知っている最適化コンパイラによって削除された関数呼び出しをモデル化する場合にのみ妥当です。
O(0)
のようなものはありません。 Oracleマシンやハイパーコンピュータでも、1回の操作に時間がかかります。つまり、solve(the_goldbach_conjecture)
、ergo:
すべてのマシン、理論的または実数、有限または無限生成アルゴリズムは、最小の時間複雑度O(1)
です。
ただし、このコードはO(0)
です。
// Hello world!
:)
Big Oの正式な定義を考えると、
f(x)およびg(x)を実数のセットに対して定義された2つの関数とする。次に、次のように書く。
f(x) = O(g(x))
が実数Mと実数x0が存在する場合にxが無限大に近づくと、次のようになります。
|f(x)| <= M * |g(x)| for every x > x0
私が見るように、g(x) = 0を代入する場合(複雑度O(0)のプログラムを作成するには))、次のようにする必要があります。
|f(x)| <= 0
、x> x0ごと(実際のMとx0の存在の制約は、実際にはここで解除されます)
これは、f(x) = 0の場合にのみ真になります。
したがって、空のプログラムはO(0)であるだけでなく、それが成り立つ唯一のプログラムであると言えるでしょう。 O(1)は、0を含めて、タスクのサイズに関係なく一定のステップ数を必要とするすべてのアルゴリズムを包含しているため、直感的にこれは正しいはずです。Oについて話すことは本質的に役に立たない(0);それはすでにO(1)にあります。O(1)
または同様の何かである可能性があるO(c)
を使用するのは、定義の単純さから完全に外れていると思います。
O(1)定義によりますが、O(0)あなたがそれについて技術的に知りたい場合:O(k1g(n))はO(k2g(n))任意の定数k1 そしてk2、O(1 * 1)はO(0 * 1)と同等であるため、O(0)はO(1)と同等です。
ただし、空のアルゴリズムは、たとえば、定義が「入力を返す」のようなものである恒等関数とは異なります。空のアルゴリズムは、空のステートメント、または2つのステートメント間で発生することのようなものです。その定義は「入力に対して絶対に何もしない」であり、おそらく単純に入力があるだけの暗黙のオーバーヘッドさえもないでしょう。
その結果、空のアルゴリズムの複雑さは、O(0)の複雑さが、空想を打つ関数の0倍、または単に0であるという点でユニークです。ビジネス全体がそうであるため、奇抜な、そしてO(0)はすでに何か有用なことを意味していませんし、それがdiscussそのようなこと、O(0)のreasonable特殊ケースは次のようなものです:
空のアルゴリズムの複雑さは、時間と空間でO(0)です。時間の複雑さがあるアルゴリズムO(0)は、空のアルゴリズム。
さあ、行きます。
O(1)である必要があります。係数は常に1です。
検討してください:
5nのように大きくなる場合、O(5n)とは言わず、O(n) [言い換えれば、O(1n)]と言います。
7n ^ 2のように成長した場合、O(7n ^ 2)と言うのではなく、O(n ^ 2)と言います[言い換えれば、O(1n ^ 2)]
同様に、O(他の定数)ではなくO(1)と言う必要があります
0 = O(f)すべての関数fについて、0 <= | f |なので、これもO(0)です。