ビッグオーフォーマル
O (f(n ))= { g(n )| ∃ C > 0 、∃ん0> 0 、∀ N >ん0:0 ≤ グラム(N )≤ C * F(n )}
非公式にビッグオー
O (f(n )) は、より遅く(または同等に速く)成長する関数のセットです。 f(n )。これは、選択した機能が何であっても、O (f(n ))、彼女に名前を付けましょう g(n )、そしてあなたは十分に大きなものを選ぶ ん、 f(n ) うよりも大きくなりますg(n )。または、言い換えれば、f(n ) 最終的にはすべての機能を上回ります O (f(n )) いつ ん 大きくなる。 ん アルゴリズムの入力サイズです。
例として。選びましょうf(n )=ん2。
と言える f(n)∈O(n3)。時間の経過とともに、私たちは表記の乱用を許可したので、ほとんどの人が書いていることに注意してくださいf(n)=O(n3) 今。
通常、アルゴリズムを評価するときは、その順序を調べます。このように、我々は予測することができますどのようにアルゴリズムの実行中の時間(とき入力サイズを大きくしますn)増加します。
あなたの例では、両方のアルゴリズムが正しいです O(n2)。したがって、実行時間は(二次的に)と同じ方法で増加します。n増加します。2番目のアルゴリズムは最初のアルゴリズムより4倍遅くなりますが、これは通常、**理論的には*関心がないものです。同じ順序のアルゴリズムは、異なる要素を持つ可能性があります(c正式な定義では)、またはステップ数を評価する関数内の異なる下位項。しかし、それは通常、実装の詳細によるものであり、私たちはそれに関心がありません。
実行するアルゴリズムがある場合 O(log(n)) 私たちは安全にそれがより速いと言うことができる時間 O(n) [1]なぜなら log(n)=O(n)。どんなに悪いO(log(n)) アルゴリズムが実装されている場合、アルゴリズムにどの程度のオーバーヘッドを加えても、常に[1]より高速になります。 O(n)アルゴリズム。アルゴリズムのステップ数が9999∗log(n)=O(log(n)) そして 0.0001∗n=O(n)、 O(log(n)) アルゴリズムは最終的に高速になります[1]。
しかし、多分、あなたのアプリケーションでは、 n は常に低く、十分な大きさになることはないため、 O(log(n))アルゴリズムは実際には高速になります。したがって、O(n) にもかかわらず、アルゴリズムは実行時間を短縮します n = O (l o g(n ))
[1]もし ん 十分に大きいです。
n
と遅く、n
通常は小さい。ファンシーアルゴリズムには大きな定数があります。n
頻繁に大きくなることがわかるまでは、ファンシーにならないでください。」 これは、以下の回答で明確に定義されている理論上の複雑さと実際の効率の違いによるものです。