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


427

Θ(n)に奇妙なΘ記号があり、その途中に何かがあり、時にはO(n)しか見られないことがあります。この記号を入力する方法を誰も知らないので、それは単に入力の怠惰ですか、それとも何か違う意味ですか?


8
明白ではありませんが、この質問は昨日のこの1つのstackoverflow.com/questions/464078/…の複製です。
リザードを請求する

回答:


600

簡単な説明:

アルゴリズムがΘ(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))およびf(x)=Ω(g(x))

基本的に、アルゴリズムがO(n)であると言うとき、それはO(n 2)、O(n 1000000)、O(2 n)などでもありますが、but(n)アルゴリズムはΘ(n 2)ではありません

実際、f(n)=Θ(g(n))はnの十分に大きな値を意味するため、cの一部の値についてはf(n)をc 1 g(n)およびc 2 g(n)内にバインドできます。1及びC 2、すなわちFの成長率は漸近Gに等しい:Gは、下部結合させることができるし、上層Fの結合します。これは、fがgの下限と上限にもなり得ることを直接意味します。したがって、

f(x)=Θ(g(x))が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))および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))(リトルオメガ)の成長率があることを意味f(x)漸近的であるよりも高い成長率g(x)

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

より詳細な議論については、ウィキペディアで定義を読むか、Cormenらによるアルゴリズムの紹介などの古典的な教科書を参照してください。


1
「アルゴリズムがO(g(n))の場合、nが大きくなるにつれてアルゴリズムの実行時間が最大でもg(n)に比例することを意味します。」次に、「基本的に、アルゴリズムがO(n)であると言うとき、それはO(n2)、O(n1000000)、O(2n)でもある」とはどう言うのですか?
Andy897 2015年

@ Andy897「比例」の定義から来ています。ウィキペディアから:「数学では、1つの変化が常に他の変化を伴う場合、およびその変化が常に定数乗数を使用して関連付けられる場合、2つの変数は比例します。定数は比例係数または比例係数と呼ばれます絶え間ない。"
Mehrdad Afshari、2015年

どういう>= \Omega(...)意味ですか?のメンバーであると言っても理解できます\Omega(...)が、それよりも大きい場合はどうなりますか?それはどういう意味ですか?
Johannes Schaub-litb

328

どちらの表記が何を意味するかを覚える簡単な方法(トリック)があります。

Big-Oの表記はすべて、バーがあると考えることができます。

Ωを見ると、バーは下にあるため、(漸近)下限です。

Θを見ると、バーが明らかに真ん中にあります。したがって、それは(漸近的な)タイトな境界です。

手書きOの場合、通常は上から終わり、波線を描きます。したがって、O(n)は関数の上限です。公平に言うと、これはほとんどのフォントでは機能しませんが、名前の本来の正当化です。


5
私は通常、質問に対して3〜4の回答を下回ることはありません。これは乗る価値があった。トリックを共有してくれてありがとう。:D
不可能

56

1つはビッグ "O"です

一つはビッグシータです

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

ビッグOは、アルゴリズムが指定された式(n ^ 2)よりも少ないステップで実行されることを意味します

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

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


20
しかし、間違っています!nが非常に大きくなると、ステップ数はn ^ 2によって制限されます。ただし、n ^ 2 + cステップで実行されるアルゴリズムはn ^ 2ステップ以上かかりますが、それでもO(n ^ 2)です。Big-O表記は、漸近的な振る舞いのみを示します。
HenryR 2009年

1
これはすべての定義であるというわけではありません。それは単なる出発点です... nが無限大に近づくにつれて漸近表記について話しているので。定数Cは非因子になります。
l_39217_l 2009年

1
私はこの答えの単純さを気に入っていますが、O(n ^ 2)アルゴリズムは1,000,000,000 * n ^ 2ステップを実行するのに非常に時間がかかり、n ^ 2よりもはるかに大きいことに注意してください。アルゴリズムがO(n ^ 2)であるということは、k * n ^ 2ステップを実行するだけで実行できることを意味します。ここで、kは正の実数です。
MarredCheese

38

ここではすでに美しく要約されている理論的な定義を提供するのではなく、簡単な例を示します。

の実行時間がf(i)isであると仮定しますO(1)。以下は、漸近ランタイムがであるコードフラグメントですΘ(n)。それは常に、関数呼び出しf(...) n回数を。下限と上限の両方がnです。

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

以下の2番目のコードフラグメントには、の漸近ランタイムがありO(n)ます。f(...) ほとんど の場合、関数呼び出しますn。上限はnですが、下限はΩ(1)or Ω(log(n))である可能性がありf2(i)ます。

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

「漸近ランタイム」とはどういう意味ですか?
チョッパードローライオン

1
この文脈での漸近は、「十分に大きいnの場合」を意味します。漸近ランタイムがΘ(n)nの増加に伴って線形的に増加するコードフラグメントのランタイム。たとえば、ランタイムTはT(n)= a * n + bとして表すことができます。nの値が小さい場合(たとえば、n = 1または2)、これは動作を説明する最良の方法ではない可能性があります-おそらく、f(i)よりもはるかに長い初期化コードがあるでしょう。
カラデニズ2014年

11

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

したがって、ある人が主張するThe Theta is expression q場合、彼らは必然的にそれを主張することにBig O is expression qなりOmega is expression qます。


大まかな例え:

場合:シータは、「あの動物には5本の足がある」と主張しています。すると、Big Oはtrue(「その動物の足は5本以下です。」)であり、Omegaはtrue(「その動物の足は5本以上です」)です。

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


11

チャートは理解する以前の答えは簡単に作ることができます:

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

Θ(n)-同じ順序 O(n)-上限

英語で、

左側には、同じ大きさの上限と下限があります(g(n)など)。定数を無視し、上限と下限の大きさが同じである場合、f(n)=Θ(g(n))またはf(n)がg(n)の大きなシータにあると正当に言えます。

右側の簡単な例から始めますと、上限g(n)は単に大きさのオーダーであり、定数cを無視することを示しています(すべての大きなO表記と同じように)。


単語とグラフをめちゃくちゃにしました。
kushalvm 2018

@kushalvm、誠実に感謝します。具体的にはどういう意味ですか?私の学習やこの答えと混同される可能性がある他の人のために。:-)
リカルド

最後の段落の最後の行は、f(n)がg(n)のシータである必要はありませんか?
kushalvm 2018

@kushalvm、それを明確にしてくれてありがとう。段落の最後の行のテキストを最後のに変更して、英語の間違いを修正しました。
Ricardo



3

制限の使用

のは、考えてみようf(n) > 0g(n) > 0、すべてのためにn。最速の実際のアルゴリズムには少なくとも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
    

2

結論:大きな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(n ^ 4)は、小さなoに対して正しいです。冗長なT(n)= O(n ^ 2)は何ですか?大きいθだ!

一般的に、大きなOはO(n ^ 2)であり、T(n)= O(n ^ 3)、T(n)= O(n ^ 4)とはほとんど言えません。どうして?私たちは無意識のうちに大きなOを大きなθと見なしているからです。

同様に、大きなΩも無意識に大きなθと見なします。

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


このコンテンツが引用としてフォーマットされているのはなぜですか?、それは、外部ソースからの引用?もしそうなら、ソースはリンクされるか、さもなければ識別されるべきです。そうでない場合は、引用書式を削除する必要があります。
Mark Amery
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.