web-dev-qa-db-ja.com

ビッグ表記は正確に何を表していますか?

私は、ビッグO、ビッグオメガ、ビッグシータの表記法の違いについて本当に混乱しています。

大きなOは上限であり、大きなOmegaは下限であることを理解していますが、大きなӨ(シータ)は正確には何を表していますか?

私はそれがtight boundを意味することを読んだことがありますが、それはどういう意味ですか?

160
user1364768

これは、アルゴリズムが特定の関数でbig-Oとbig-Omegaの両方であることを意味します。

たとえば、Ө(n)の場合、関数(実行時など)が十分に大きいkの場合はn*kより大きく、関数がn*Kより小さい場合は他の定数nなどの定数Kがあります十分に大きいn

つまり、十分に大きいnの場合、2つの線形関数の間に挟まれます。

k < Kおよびnが十分に大きい場合、n*k < f(n) < n*K

85
happydave

まず、ビッグO、ビッグシータ、ビッグオメガとは何かを理解しましょう。これらはすべて sets の関数です。

ビッグOは上限 漸近境界 を与え、ビッグオメガは下限を与えます。 Big Thetaは両方を提供します。

Ө(f(n))であるものはすべてO(f(n))でもありますが、その逆ではありません。
T(n)は、Ө(f(n))O(f(n))の両方にある場合、Omega(f(n))にあると言われます。
セット用語では、Ө(f(n))は、O(f(n))およびOmega(f(n))交差 です。

たとえば、マージソートの最悪のケースはO(n*log(n))Omega(n*log(n))の両方であり、したがってӨ(n*log(n))でもありますが、n^2は漸近的に「より大きい」ので、O(n^2)でもあります。ただし、アルゴリズムはӨ(n^2)ではないため、notOmega(n^2)です。

少し深い数学の説明

O(n)は漸近的な上限です。 T(n)O(f(n))である場合、特定のn0から、T(n) <= C * f(n)などの定数Cがあることを意味します。一方、big-Omegaは、T(n) >= C2 * f(n))のような定数C2があると言っています。

混同しないでください!

最悪、最高、平均のケース分析と混同しないでください:3つの(Omega、O、Theta)表記はすべて、notが最高、最悪、アルゴリズムの平均ケース分析。これらのそれぞれを各分析に適用できます。

私たちは通常、アルゴリズムの複雑さを分析するために使用します(上記のマージソートの例のように)。 「アルゴリズムAはO(f(n))」と言うとき、私たちが本当に意味するのは、「最悪の場合のアルゴリズムの複雑さ1 ケース分析はO(f(n)) "-意味-関数f(n)を「類似」(または形式的には悪くない)スケーリングします。

アルゴリズムの漸近的境界を考慮するのはなぜですか?

それには多くの理由がありますが、最も重要なものは次のとおりだと思います。

  1. exact複雑度関数を決定するのははるかに難しいため、理論的には十分な情報を提供するbig-O/big-Theta表記法で「妥協」します。
  2. 操作の正確な数もプラットフォームに依存します。たとえば、16個の数字のベクトル(リスト)がある場合。どのくらいの操作が必要ですか?答えは次のとおりです。いくつかのCPUはベクトルの追加を許可しますが、他のCPUは許可しないため、答えは実装やマシンによって異なります。これは望ましくない特性です。ただし、big-O表記は、マシンと実装の間でずっと一定です。

この問題を実証するには、次のグラフをご覧ください。 enter image description here

f(n) = 2*nf(n) = nよりも「悪い」ことは明らかです。しかし、その違いは、他の機能と比べてそれほど劇的ではありません。 f(n)=lognが他の関数よりも急速に低くなり、f(n) = n^2が他の関数よりもはるかに高くなっていることがわかります。
そう-上記の理由により、定数因子(グラフの例では2 *)を「無視」し、big-O表記のみを使用します。

上記の例では、f(n)=n, f(n)=2*nO(n)Omega(n)の両方にあるため、Theta(n)にもあります。
一方、f(n)=lognO(n)にあります(f(n)=nよりも「良い」)が、Omega(n)にはないので、Theta(n)にもありません。
対称的に、f(n)=n^2Omega(n)にありますが、O(n)にはないため、-もTheta(n)ではありません。


1通常、常にではありません。分析クラス(最悪、平均、最高)が欠落している場合、実際には最悪の場合を意味します。

307
amit

Theta(n):f(n)Theta(g(n))f(n)の間に挟むことができる正の定数c1c2が存在する場合、関数c1(g(n))c2(g(n))に属します。つまり、上限と下限の両方を提供します。

Theta(g(n))= {f(n):0 <= c1(g(n))となる正の定数c1、c2およびn1が存在する<= f(n)<= c2(g(n))すべてのn> = n1}

f(n)=c2(g(n))またはf(n)=c1(g(n))と言うとき、それは漸近的にタイトな境界を表します。

O(n):上限のみを指定します(タイトである場合とタイトでない場合があります)

O(g(n))= {f(n):0 <= f(n)<= cg(nとなるような正の定数cおよびn1が存在する)すべてのn> = n1}

ex:バインドされた2*(n^2) = O(n^2)は漸近的にタイトですが、バインドされた2*n = O(n^2)は漸近的にタイトではありません。

o(n):上限のみを指定します(厳密な制限はありません)

O(n)とo(n)の顕著な差はf(n)はすべてのn> = n1に対してcg(n)より小さいが、 O(n)のように等しくありません。

ex2*n = o(n^2)、ただし2*(n^2) != o(n^2)

13
ThisIzKp

これが古典的な CLRS (66ページ)であなたが見つけたいと思うことを願っています: enter image description here

1
Lerner Zhang

ビッグシータ表記法:

バディを台無しにしないでください!!

正の値の関数f(n)とg(n)が正の値の引数nをとる場合、then(g(n))は{f(n)として定義されます。すべてのn> = n1に対して定数c1、c2およびn1が存在します}

ここで、c1 g(n)<= f(n)<= c2 g(n)

例を見てみましょう。

let f(n)= -

g(n)=

c1 = 5およびc2 = 8およびn1 = 1

すべての表記法の中で、ϴ表記法は関数の成長率について最良の直観を与えます。これは、上限と下限をそれぞれ与えるbig-ohおよびbig -omegaとは異なり、タイトな境界を与えるためです。

は、g(n)がf(n)に近いこと、g(n)の成長率がf(n)可能な限り。

see the image to get a better intuition