web-dev-qa-db-ja.com

Θ(n)とO(n)の違いは何ですか?

時々私はそれの真ん中に何かがある奇妙なΘシンボルとΘ(n)を見ます、そして時々ちょうどO(n)。誰かがこのシンボルをタイプする方法を知らないのでそれはタイプすることの単なる怠惰ですか、またはそれは別の何かを意味しますか?

402
martinus

簡単な説明:

アルゴリズムがΘ(g(n))である場合、n(入力サイズ)が大きくなるにつれてアルゴリズムの実行時間がg(n)に比例することを意味します。

アルゴリズムがO(g(n))である場合、nが大きくなるにつれてアルゴリズムの実行時間が せいぜい g(n)に比例します。

通常、人々がO(g(n))について話すときでも、実際にはΘ(g(n))を意味しますが、技術的には違いがあります。


より技術的に:

O(n)は上限を表します。 Θ(n)はタイトバウンドを意味します。 Ω(n)は下限を表します。

f(x) = Θ(g(x)) iff f(x) = O(g(x)) and f(x) = Ω(g(x))

基本的に、アルゴリズムがO(n)であると言うとき、それはO(n2)、O(n1000000)、O(2n)、...しかし、Θ(n)アルゴリズムはnotΘ(n2)。

実際、f(n) =Θ(g(n))は十分に大きいnの値を意味するため、f(n)はc内にバインドできます。1g(n)およびc2cの一部の値のg(n)1 およびc2つまり、fの成長率はgに漸近的に等しくなります。gは下限andおよびfの上限になります。これは、fがgの下限および上限にもなり得ることを直接意味します。その結果、

f(x) = Θ(g(x)) iff g(x) = Θ(f(x))

同様に、f(n) =Θ(g(n))を示すには、gがfの上限であることを示すだけで十分です(つまり、f(n) = O(g(n)))およびfはgの下限(つまりf(n) =Ω(g(n))です。これはg(n) = O(f(n)))。簡潔に、

f(x) = Θ(g(x)) iff f(x) = O(g(x)) and g(x) = O(f(x))


関数の上限と下限を表すlittle-ohおよびlittle-omega(ω)表記もあります。

要約する:

f(x) = O(g(x))(big-oh)は、f(x)の成長率が漸近的であることを意味します より小さいか等しい g(x)の成長率。

f(x) = Ω(g(x))(ビッグオメガ)は、f(x)の成長率が漸近的であることを意味します 以上 g(x)の成長率

f(x) = o(g(x))(little-oh)は、f(x)の成長率が漸近的であることを意味します 未満 g(x)の成長率。

f(x) = ω(g(x))(little-omega)は、f(x)の成長率が漸近的であることを意味します より大きい g(x)の成長率

f(x) = Θ(g(x))(シータ)は、f(x)の成長率が漸近的であることを意味します に等しい g(x)の成長率

より詳細な議論については、 Wikipediaの定義を読む 、またはCormen et al。

577
Mehrdad Afshari

どの表記が何を意味するのかを思い出すための簡単な方法(トリック、私は思う)があります。

すべてのBig-O表記はバーを持つと見なすことができます。

Ωを見ると、バーは一番下にあるので、(漸近的な)下限です。

Θを見ると、バーは明らかに中央にあります。それで、それは(漸近的な)厳しい限界です。

Oを手書きするとき、あなたは通常上で終わり、しわを引く。したがって、O(n)は関数の上限です。公平を期すために、これはほとんどのフォントでは動作しませんが、それは名前の本来の正当性です。

309
Andrei Krotkov

一つはビッグ "O"

一つはビッグシータです

http://en.wikipedia.org/wiki/Big_O_notation

大きいOはあなたのアルゴリズムが与えられた式よりも多くのステップで実行されないことを意味します(n ^ 2)

Big Omegaはあなたのアルゴリズムが与えられた式よりも少ないステップで実行されることを意味します(n ^ 2)

両方の条件が同じ式に当てはまる場合は、ビッグシータ表記を使用できます。

55
l_39217_l

すでにここで美しくまとめられている理論的定義を提供するのではなく、簡単な例を挙げます。

f(i)の実行時間がO(1)であると仮定します。以下は、漸近的ランタイムがΘ(n)であるコードの一部です。それは常に関数をf(...)n回呼び出します。下限と上限はどちらもnです。

for(int i=0; i<n; i++){
    f(i);
}

以下の2番目のコードは、O(n)の漸近的ランタイムです。それは関数をf(...)せいぜいn回呼び出します。上限はnですが、下限はΩ(1)の中で何が起こるかに応じて、Ω(log(n))またはf2(i)にすることができます。

for(int i=0; i<n; i++){
    if( f2(i) ) break;
    f(i);
}
34
kara deniz

A chart は以前の答えを理解しやすくするでしょう。

Θ表記 - 同じ順序| O表記 - 上限

Θ(n) - Same orderO(n) - Upper bound

英語で、

左側には、どちらも同じ桁の上限と下限があることに注意してください(つまり、g(n))。定数を無視し、上限と下限の桁数が同じであれば、f(n)=Θ(g(n))またはf(n) )はg(n)の大θにある。

より単純な例である右から始めて、それは上限g(n)は単に大きさのオーダーであり、定数を無視しますc(すべてのように - big O表記はします)。

10
Ricardo

シータは、大きなOとOmegaが同じである特別な状況を指す簡単な方法です。

したがって、誰かがThe Theta is expression qを主張している場合、彼らは必然的にそのBig O is expression qおよびOmega is expression qも主張しています。


大まかなアナロジー:

If:Thetaは、「あの動物は5本の足を持っている」と主張している。 Big Oは真実であり(「その動物は5本足以下である」)、Omegaは真実である(「その動物は5本足以上である」)。

式は必ずしも特定の数ではなく、log(n)、n、n ^ 2などのように桁違いに変化する関数であるため、これは大まかな類推にすぎません。

10
ahnbizcad

f(n)は、O(n)として正のkが存在する場合、f(n)<=k*nに属します。

f(n)は正のk1が存在する場合はΘ(n)に属し、k2k1*n<=f(n)<=k2*nとして

Big O表記に関するウィキペディアの記事

6
user54579

結論:我々は、大きいO、大きいθ、そして大きいΩを同じものとみなします。

どうして?その理由を以下に説明します。

最初に、私は1つの間違った記述を明確にします、何人かの人々は私達がちょうど最悪の時の複雑さを気にかけていると思うので、私達は常に大きいθの代わりに大きいOを使います。私はこの男がでたらめだと言うでしょう。上限と下限は1つの関数を記述するために使用され、時間の複雑さを記述するためには使用されません。最悪時間関数には上限と下限があります。ベストタイム関数には上限と下限もあります。

大きいOと大きいθの関係を明確に説明するために、最初に大きいOと小さいoの関係について説明します。定義から、小さいoが大きいOのサブセットであることを容易に知ることができます。例えば:

T(n n ^ 2 + n、T(n)= O(n ^ 2)、T(n)= O(n ^ 3)、T(n)= O(n) ^ 4)。しかし、小さいoの場合、T(n)= o(n ^ 2)は小さいoの定義を満たしていないので、T(n)= o(n ^ 3)、T(n)= o(冗長なT(n)= O(n ^ 2)は何ですか?それは大きいθ!)==

一般に、大きいOはO(n ^ 2)、T(n)= O(n ^ 3)、T(n)= O(n ^ 4)とは言い難いです。どうして?無意識のうちに大きいOを大きいθと見なすからです。

同様に、我々はまた、潜在的に大きいΩを大きいθとみなします。

一言で言えば、大きいO、大きいθ、大きいΩは定義から同じものではありませんが、私たちの口と脳では同じものです。

4
haibo cu

制限を使用する

すべてのnについてf(n) > 0g(n) > 0を考えてみましょう。最速の実際のアルゴリズムは少なくとも1つの操作を持ち、開始後にその実行を完了するので、これを考慮しても大丈夫です。絶対値(f(n))の代わりに値(|f(n)|)を使用できるので、これは微積分を単純化します。

  1. f(n) = O(g(n))

    一般:

              f(n)     
    0 ≤ lim ──────── < ∞
        n➜∞   g(n)
    

    g(n) = n:の場合

              f(n)     
    0 ≤ lim ──────── < ∞
        n➜∞    n
    

    例:

        Expression               Value of the limit
    ------------------------------------------------
    n        = O(n)                      1
    1/2*n    = O(n)                     1/2
    2*n      = O(n)                      2
    n+log(n) = O(n)                      1
    n        = O(n*log(n))               0
    n        = O(n²)                     0
    n        = O(nⁿ)                     0
    

    反例:

        Expression                Value of the limit
    -------------------------------------------------
    n        ≠ O(log(n))                 ∞
    1/2*n    ≠ O(sqrt(n))                ∞
    2*n      ≠ O(1)                      ∞
    n+log(n) ≠ O(log(n))                 ∞
    
  2. f(n) = Θ(g(n))

    一般:

              f(n)     
    0 < lim ──────── < ∞
        n➜∞   g(n)
    

    g(n) = n:の場合

              f(n)     
    0 < lim ──────── < ∞
        n➜∞    n
    

    例:

        Expression               Value of the limit
    ------------------------------------------------
    n        = Θ(n)                      1
    1/2*n    = Θ(n)                     1/2
    2*n      = Θ(n)                      2
    n+log(n) = Θ(n)                      1
    

    反例:

        Expression                Value of the limit
    -------------------------------------------------
    n        ≠ Θ(log(n))                 ∞
    1/2*n    ≠ Θ(sqrt(n))                ∞
    2*n      ≠ Θ(1)                      ∞
    n+log(n) ≠ Θ(log(n))                 ∞
    n        ≠ Θ(n*log(n))               0
    n        ≠ Θ(n²)                     0
    n        ≠ Θ(nⁿ)                     0
    
3