大きなシータを計算する方法のリアルタイムの例を教えてください。
大きなシータは平均的なケース (最小-最大)/2 のようなものですか?
つまり (最小時間 - 大きな O)/2
間違っていたら訂正してください、ありがとう
大きなシータを計算する方法のリアルタイムの例を教えてください。
大きなシータは平均的なケース (最小-最大)/2 のようなものですか?
つまり (最小時間 - 大きな O)/2
間違っていたら訂正してください、ありがとう
ビッグ シータ表記は、次のルールを表します。
任意の 2 つの関数 について
f(n)
、が無限大になるにつれてとが両方とも有界g(n)
である場合、と. その場合、は の成長の上限と下限の両方です。f(n)/g(n)
g(n)/f(n)
n
f = Θ(g)
g = Θ(f)
g
f
アルゴリズムの例を次に示します。
def find-minimum(List)
min = +∞
foreach value in List
min = value if min > value
return min
入力リストのサイズであるc(n)
コスト関数を評価したいと思います。n
このアルゴリズムは、リスト内のすべての項目に対して 1 つの比較を実行するため、 c(n) = n
.
c(n)/n = 1
n
これは無限大に向かうにつれて制限されたまま であるためc(n)
、 より速く成長することはありませんn
。これが big-O 記法 の意味c(n) = O(n)
です。逆に、n/C(n) = 1
も制限されたままであるためc(n)
、 よりも遅くはなりませんn
。遅くも速くも成長しないため、同じ速度で成長する必要があります。これがシータ表記の意味c(n) = Θ(n)
です。
c(n)/n²
も有界であることに注意してくださいc(n) = O(n²)
— big-O 記法は複雑さの上限にすぎないため、O(n)
関数は O(n²)
, O(n³)
...
ただし、n²/c(n) = n
は有界ではないので、c(n) ≠ Θ(n²)
. これは、ビッグ シータ表記の興味深い特性です。これは、複雑さの上限と下限の両方です。
ビッグ シータは、関数T(n)
: if:のタイト バウンドです。その場合Omega(f(n))<=T(n)<=O(f(n))
、Theta(f(n)) は T(n) のタイト バウンドです。
言い換えれば、Theta(f(n)) は、関数 T(n) を「記述」します。O [big O] と Omega の両方が、同じ T を同じ f で「記述」する場合です。
たとえば、[正しい中央値の選択による] クイックソートは、常に最大で O(nlogn)、少なくとも Omega(nlogn) を取るため、[適切な中央値の選択による] クイックソートは Theta(nlogn) です。
編集:
コメントに議論を追加:
配列の検索は依然として Theta(n) です。シータ関数は、最悪/最良のケースを示すのではなく、望ましいケースの動作を示します。つまり、配列を検索します。T(n)=最悪の場合の演算数です。ここでは、明らかT(n)<=O(n)
に だけでなくT(n)>=n/2
、最悪の場合、配列全体を反復処理する必要があるためT(n)>=Omega(n)
、したがって Theta(n) は漸近的に制限されます。
http://en.wikipedia.org/wiki/Big_O_notation#Related_asymptotic_notationsから、"Big O" は上限を表し、"Big Theta" は上限と下限、つまりn
無限に向かう極限を表すことがわかります。
f(n) = O(g(n)) --> |f(n)| < k.g(n)
f(n) = Theta(g(n)) --> k1.g(n) < f(n) < k2.g(n)
したがって、Big O から Big Theta を推測することはできません。