Θ(n)に奇妙なΘ記号があり、その途中に何かがあり、時にはO(n)しか見られないことがあります。この記号を入力する方法を誰も知らないので、それは単に入力の怠惰ですか、それとも何か違う意味ですか?
Θ(n)に奇妙なΘ記号があり、その途中に何かがあり、時にはO(n)しか見られないことがあります。この記号を入力する方法を誰も知らないので、それは単に入力の怠惰ですか、それとも何か違う意味ですか?
回答:
アルゴリズムがΘ(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らによるアルゴリズムの紹介などの古典的な教科書を参照してください。
>= \Omega(...)
意味ですか?のメンバーであると言っても理解できます\Omega(...)
が、それよりも大きい場合はどうなりますか?それはどういう意味ですか?
どちらの表記が何を意味するかを覚える簡単な方法(トリック)があります。
Big-Oの表記はすべて、バーがあると考えることができます。
Ωを見ると、バーは下にあるため、(漸近)下限です。
Θを見ると、バーが明らかに真ん中にあります。したがって、それは(漸近的な)タイトな境界です。
手書きOの場合、通常は上から終わり、波線を描きます。したがって、O(n)は関数の上限です。公平に言うと、これはほとんどのフォントでは機能しませんが、名前の本来の正当化です。
1つはビッグ "O"です
一つはビッグシータです
http://en.wikipedia.org/wiki/Big_O_notation
ビッグOは、アルゴリズムが指定された式(n ^ 2)よりも少ないステップで実行されることを意味します
Big Omegaは、アルゴリズムが指定された式(n ^ 2)よりも少ないステップで実行されることを意味します
両方の条件が同じ式に当てはまる場合、ビッグシータ表記を使用できます。
ここではすでに美しく要約されている理論的な定義を提供するのではなく、簡単な例を示します。
の実行時間が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);
}
Θ(n)
nの増加に伴って線形的に増加するコードフラグメントのランタイム。たとえば、ランタイムTはT(n)= a * n + bとして表すことができます。nの値が小さい場合(たとえば、n = 1または2)、これは動作を説明する最良の方法ではない可能性があります-おそらく、f(i)よりもはるかに長い初期化コードがあるでしょう。
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などのさまざまな桁の関数であるため、これは大まかな類推にすぎません。
チャートは理解する以前の答えは簡単に作ることができます:
英語で、
左側には、同じ大きさの上限と下限があります(g(n)など)。定数を無視し、上限と下限の大きさが同じである場合、f(n)=Θ(g(n))またはf(n)がg(n)の大きなシータにあると正当に言えます。
右側の簡単な例から始めますと、上限g(n)は単に大きさのオーダーであり、定数cを無視することを示しています(すべての大きなO表記と同じように)。
f(n)
としてO(n)
存在する場合に属しますk
f(n)<=k*n
f(n)
属しているΘ(n)
正存在する場合はk1
、k2
としてk1*n<=f(n)<=k2*n
のは、考えてみようf(n) > 0
とg(n) > 0
、すべてのためにn
。最速の実際のアルゴリズムには少なくとも1つの演算があり、開始後にその実行を完了するため、これを考慮しても問題ありません。これf(n)
により、絶対値(|f(n)|
)の代わりに値()を使用できるため、計算が単純になります。
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)) ∞
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
結論:大きな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、大きなθ、大きなΩは定義から同じものではありませんが、口と脳では同じものです。