線形関数f(n)= an+b
があるとします。この関数がO(n2)とΘ(n)
?
ここでは数学的な厳密さは必要ありません。プログラマーの答えが必要です。説明するいくつかの論理的な方法。
これが、数学のQ&AではなくプログラマのQ&Aに質問を投稿しなかった理由です。
Big Oh表記(O、Theta、Omega)は、関数の成長率に関するものです。
アルゴリズムを実装すると、データセットを操作するときにランタイムがどのように変化するかという特定の特性があります。これで、アルゴリズムを最適化して100倍高速に実行できます。確かに、これは素晴らしいことですが、基本的には同じアルゴリズムです。同様に、数年後には、コンピューターの速度は現在の2倍になる可能性があります。
ランダウ記法は、これらの一定の要因を抽象化します。アルゴリズムf
が常に他のアルゴリズムg
の2倍の速さであるかどうかは関係ありません:多分g
は4倍速く実行するように最適化できます。代わりに、より高速なハードウェアを購入できます。この観点から見ると、「同じ」と言えるかもしれません。 (それはあなたが(常に)実際に一定の要因を無視できると言うことではありません。)
Big ohは上限を指定します。これは_<=
_関係に似ています。
_1 < 2
_がtrueであることに同意します。これは、_1
_が他のどの数値よりも小さくなることはできないという意味ですか?確かに違います。 _1
_より大きい数は無限にあります。
成長率についても同様です。 O(n)
は、線形に(またはゆっくりと)成長するすべての関数のセットを示します。一方、O(n^2)
は、2次強制力(またはより遅い)で成長するすべての関数を示します。一次関数の方が二次関数よりもゆっくりと成長することに同意することでしょう。
これが、関数が複数の「Big-oh」クラスに含まれる可能性がある理由です。
これは、さまざまな機能の比較です :(クヌースの具体的な数学から)
左から右に、関数はより速く成長します。
また、 、つまり2> 1であるため、n ^ 2はn ^ 1よりも速く成長します。
「fはgと同じくらい速く成長する」
「fはgと同じくらい遅く、または同じくらい速く成長する」
上記2つの組み合わせ。これは、関数f
がg
と「同等に速く」成長することを示しています。それは同値関係です。
f
とg
の2つのアルゴリズムがあるとします。
オメガ
想定 、 つまり、予算に関係なく、システムに追加できるコンピューティング能力は一定ではないため、f
は常にg
と同じ速さで実行されます。
ビッグオー
想定 、 つまり、十分なデータがある場合、f
は、システムに追加する計算能力に関係なく、常にg
よりも高速に実行されます。
実際にこれを証明しようとしている場合は、ランダウ記法の定義を使用して、関数が必要な条件を満たすことを示す必要があります。
したがって、条件が成立するように、c
、d
、_n_0
_の値を見つける必要があります。
これは、c
を使用して下限を設定する方法です。
c
を_a-1
_よりも小さいものとして任意に定義することは完全に問題ないことを理解することが重要です。 Theta(g)の定義は、「c
が存在します」と述べています。 0より大きい限り、任意の値を使用できます(a
が正の実数の場合、実際には_a - 1
_が負になる可能性があるため、証明を少し変更する必要があります)。
(私はa
が正であると想定しています。そうでない場合、関数はn
の大きな値に対して常に負になるため、ランタイムを示す関数には意味がありません。)
あなたは上限についてそれを試すことができます、それは非常に似ています。方法がわからない場合は、証拠を提示できます。
ヒント:_d > a + 1
_で始まる
間違った方法でそれを証明しないことが重要です。 (an + b)がO(n)にあると想定してそこから移動した場合、あなたは何を望んでいるのかを証明していません。すべてのステップが双方向に進んでいることを確認する必要があります。つまり、_=>
_の代わりに_<=>
_があります。
多項式を扱うときは、多項式の次数のみを気にします。つまり、_an + b
_の場合は、n
のみに関心があります。 _an^3 + bn^2 + cn + d
_の場合は、_n^3
_のみが重要になります。
したがって、次数dの多項式は常にΘ(n^d)
にあります。シンプル。
ここで、ΘとOの違いについて説明する必要があります。本質的には、それぞれ_==
_と_<=
_の違いと同じです。したがって、Θ(n)
は、常にn
の定数係数内にあるisを意味します。 O(n)
は、常にn
の定数係数内にあるか、n
よりも小さいことを意味します。
これは、s
のΘ(s)
のすべての関数がO(s)
にも含まれることを意味します。また、関数がΘ(s)
にあり、s
が常に他の関数t
よりも小さい場合、その関数はO(t)
にありますが、Θ(t)
にはありません。
完全を期すために、Ω(n)
もあります。 _Θ
_が_==
_を表し、O
が_<=
_を表す場合、_Ω
_は_>=
_を表します。したがって、_an + b
_はΩ(1)
、Θ(n)
およびO(n^2)
にあります。
先に述べたように、クラス多項式が何であるかを理解するのは本当に簡単です。あなたは次数を見るだけです。他にも操作しやすい関数がいくつかあります。
任意のa
およびb
に対する_a^bn
_の形式の関数は、Θ(a^n)
にあります。値_c >= a
_の場合、O(c^n)
にあります。すべての多項式はO(2^n)
にあります。基本的に、これは指数関数が常に多項式を打ち負かし、指数関数の基底が重要であることを示しています。
対数は反対です。まず、_log_b n
_は、b
のΘ(log n)
にあります。これは、底が対数に関係ないことを意味します。これは、対数での異なる底間の切り替えが定数を乗算するだけなので、理にかなっています。対数関数もO(n)
にあります。つまり、対数関数はどの多項式よりも小さくなります(少なくとも次数1)。
これらの関数の合計を考えると、最大のものが「勝ち」ます。したがって、_n + log n
_はΘ(n)
に含まれます。これは、n
の項が_log n
_の項を支配するためです。乗算はもっと複雑です。 CSの場合、知っておく必要があるのは、_nlog n
_がn
と_n^2
_の間にあることだけです。