web-dev-qa-db-ja.com

関数an + bがO(n ^ 2)とΘ(n)に属しているというステートメントを説明してください。

線形関数f(n)= an+bがあるとします。この関数がO(n2)とΘ(n)

ここでは数学的な厳密さは必要ありません。プログラマーの答えが必要です。説明するいくつかの論理的な方法。

これが、数学のQ&AではなくプログラマのQ&Aに質問を投稿しなかった理由です。

12
Geek

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」クラスに含まれる可能性がある理由です。

これは、さまざまな機能の比較です constraints:(クヌースの具体的な数学から)

growth rate comparisons

左から右に、関数はより速く成長します。

また、 enter image description here、つまり2> 1であるため、n ^ 2はn ^ 1よりも速く成長します。

定義

definition Omega

「fはgと同じくらい速く成長する」

definition big Oh

「fはgと同じくらい遅く、または同じくらい速く成長する」

definition Theta

上記2つの組み合わせ。これは、関数fgと「同等に速く」成長することを示しています。それは同値関係です。

解釈

fgの2つのアルゴリズムがあるとします。

オメガ

想定 f not in Theta of g、 f in Omega of g つまり、予算に関係なく、システムに追加できるコンピューティング能力は一定ではないため、fは常にgと同じ速さで実行されます。

ビッグオー

想定 f not in Theta of g、 f in Big Oh of g つまり、十分なデータがある場合、fは、システムに追加する計算能力に関係なく、常にgよりも高速に実行されます。

証明

実際にこれを証明しようとしている場合は、ランダウ記法の定義を使用して、関数が必要な条件を満たすことを示す必要があります。

したがって、条件が成立するように、cd、_n_0_の値を見つける必要があります。

これは、cを使用して下限を設定する方法です。

proof

cを_a-1_よりも小さいものとして任意に定義することは完全に問題ないことを理解することが重要です。 Theta(g)の定義は、「cが存在します」と述べています。 0より大きい限り、任意の値を使用できます(aが正の実数の場合、実際には_a - 1_が負になる可能性があるため、証明を少し変更する必要があります)。

(私はaが正であると想定しています。そうでない場合、関数はnの大きな値に対して常に負になるため、ランタイムを示す関数には意味がありません。)

あなたは上限についてそれを試すことができます、それは非常に似ています。方法がわからない場合は、証拠を提示できます。

ヒント:_d > a + 1_で始まる

注意

間違った方法でそれを証明しないことが重要です。 (an + b)がO(n)にあると想定してそこから移動した場合、あなたは何を望んでいるのかを証明していません。すべてのステップが双方向に進んでいることを確認する必要があります。つまり、_=>_の代わりに_<=>_があります。

20
phant0m

多項式を扱うときは、多項式の次数のみを気にします。つまり、_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_の間にあることだけです。

5
Tikhon Jelvis