私は、ビッグO、ビッグオメガ、ビッグシータの表記法の違いについて本当に混乱しています。
大きなOは上限であり、大きなOmegaは下限であることを理解していますが、大きなӨ(シータ)は正確には何を表していますか?
私はそれがtight boundを意味することを読んだことがありますが、それはどういう意味ですか?
これは、アルゴリズムが特定の関数でbig-Oとbig-Omegaの両方であることを意味します。
たとえば、Ө(n)
の場合、関数(実行時など)が十分に大きいk
の場合はn*k
より大きく、関数がn*K
より小さい場合は他の定数n
などの定数K
があります十分に大きいn
。
つまり、十分に大きいn
の場合、2つの線形関数の間に挟まれます。
k < K
およびn
が十分に大きい場合、n*k < f(n) < n*K
まず、ビッグ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)
を「類似」(または形式的には悪くない)スケーリングします。
それには多くの理由がありますが、最も重要なものは次のとおりだと思います。
この問題を実証するには、次のグラフをご覧ください。
f(n) = 2*n
がf(n) = n
よりも「悪い」ことは明らかです。しかし、その違いは、他の機能と比べてそれほど劇的ではありません。 f(n)=logn
が他の関数よりも急速に低くなり、f(n) = n^2
が他の関数よりもはるかに高くなっていることがわかります。
そう-上記の理由により、定数因子(グラフの例では2 *)を「無視」し、big-O表記のみを使用します。
上記の例では、f(n)=n, f(n)=2*n
はO(n)
とOmega(n)
の両方にあるため、Theta(n)
にもあります。
一方、f(n)=logn
はO(n)
にあります(f(n)=n
よりも「良い」)が、Omega(n)
にはないので、Theta(n)
にもありません。
対称的に、f(n)=n^2
はOmega(n)
にありますが、O(n)
にはないため、-もTheta(n)
ではありません。
1通常、常にではありません。分析クラス(最悪、平均、最高)が欠落している場合、実際には最悪の場合を意味します。
Theta(n):f(n)
をTheta(g(n))
とf(n)
の間に挟むことができる正の定数c1
とc2
が存在する場合、関数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)のように等しくありません。
ex:2*n = o(n^2)
、ただし2*(n^2) != o(n^2)
これが古典的な CLRS (66ページ)であなたが見つけたいと思うことを願っています:
バディを台無しにしないでください!!
正の値の関数f(n)とg(n)が正の値の引数nをとる場合、then(g(n))は{f(n)として定義されます。すべてのn> = n1に対して定数c1、c2およびn1が存在します}
ここで、c1 g(n)<= f(n)<= c2 g(n)
g(n)= (
c1 = 5およびc2 = 8およびn1 = 1
すべての表記法の中で、ϴ表記法は関数の成長率について最良の直観を与えます。これは、上限と下限をそれぞれ与えるbig-ohおよびbig -omegaとは異なり、タイトな境界を与えるためです。
は、g(n)がf(n)に近いこと、g(n)の成長率がf(n)可能な限り。