Big-O表記法O(n)
とLittle-O表記法o(n)
の違いは何ですか?
f∈O(g)は言う、本質的に
少なくとも1つ定数の選択k> 0の場合、定数aを見つけることができます。不等式0 <= f(x) <= k g(x)がすべてのx> aについて成り立つこと。
O(g)はこの条件が成り立つすべての関数の集合です。
f∈o(g)は言う、本質的に
every定数の選択k> 0の場合、次のような定数aを見つけることができます。不等式0 <= f(x) <k g(x)はすべてのx> aについて成り立つ。
もう一度、o(g)が集合であることに注意してください。
Big-Oでは、不等式が最小値xを超えて成り立つ特定の乗数kを見つけることだけが必要です。
Little-oでは、最小値xが存在する必要があります。この最小値を超えても、不等式は成り立ちますk負でもゼロでもない限り。
どちらも上限について説明していますが、やや直観的にはわかりませんが、Little-oのほうが強力です。 f∈O [(g)の場合よりもf∈o(g)の場合の方が、fとgの成長率の間に格差が大きい。
格差の一例は次のとおりです。f∈O(f)は真ですが、f∈o(f)は偽です。したがって、Big-Oは "f∈O(g)はfの漸近的成長がgよりも速くないことを意味する"と読むことができるが、 "f∈o(g)はfの漸近的成長はgのものより厳密に遅い」 <=
と<
のようなものです。
より具体的には、g(x)の値がf(x)の値の定数倍である場合、f∈O(g)は真です。これが、big-O記法で作業するときに定数を削除できる理由です。
しかし、f∈o(g)が真になるためには、gはその式にxのより高いべき乗を含まなければなりません。 xが大きくなるにつれて、f(x)およびg(x)は実際には大きくなるはずです。
純粋に数学的な例を使用するには(アルゴリズムを参照するのではなく):
以下はBig-Oに当てはまりますが、little-oを使用した場合は当てはまりません。
以下は、little-oに当てはまります。
F∈o(g)の場合、これはf∈O(g)を意味することに注意してください。例えばx²∈o(x³)なので、x²∈O(x³)であることも事実です(ここでも、Oを<=
、oを<
と考えてください)。
≤
が<
と同じように、Big-Oはlittle-oと同じです。 Big-Oは包括的な上限ですが、little-oは厳密な上限です。
たとえば、関数f(n) = 3n
は次のとおりです。
O(n²)
、o(n²)
、およびO(n)
O(lg n)
、o(lg n)
、またはo(n)
にはありません同様に、1
の数は:
≤ 2
、< 2
、および≤ 1
≤ 0
、< 0
、または< 1
ではないこれが、一般的な考え方をまとめた表です。
(注:この表は優れたガイドですが、制限の定義は通常の制限ではなく、 優れた制限 という観点で定義する必要があります。例えば、3 + (n mod 2)
は3から4の間で振動します。通常の制限はありませんが、O(1)
にはまだ_ lim sup
があります。
Big-O記法が漸近的比較にどのように変換されるかを覚えておくことをお勧めします。比較は覚えやすいですが、あなたがnのようなことを言うことができないので柔軟性が劣りますO(1) = P.
概念的に何かを理解できないときは、なぜXを使うのかがXを理解するのに役立ちます。 。)
アルゴリズムを分類するための一般的な方法は実行時であり、アルゴリズムの複雑さの大さを引用することによって、どれが「より優れている」かについてのかなり良い推定値を得ることができます。 Oで!実世界でも、O(N)はO(N²)よりも "優れている"ので、超大規模な定数などのようなばかげたことは除外されます。
O(N)で動作するアルゴリズムがいくつかあるとしましょう。かなりいいですね。しかし、あなた(あなたは素晴らしい人、あなた)はOで実行されるアルゴリズムを思い付いたとしましょう((N⁄loglogloglogN)わーい!その速い!しかし、あなたが論文を書いているとき、あなたはそれを何度も何度も愚かに書いているのを感じるでしょう。それで、あなたはそれを一度書くと、「この論文では、以前は時間O(N)で計算可能だったアルゴリズムXが実際にはo(n)で計算可能であることを証明した」
このように、誰もがあなたのアルゴリズムがより速いことを知っています---どれほど不明瞭であるかによって、彼らはそれがより速いことを知っています。理論的には:)