私は線形関数を持っているとしましょうf(n)= an+b
、この関数がO(n 2)に属していることを証明する最良の方法は何Θ(n)
ですか?
ここでは数学的な厳密さは必要ありません。プログラマーの回答が必要です。説明の論理的な方法。
これがまさに数学のQ&AではなくプログラマーのQ&Aに質問を投稿しなかった理由です。
私は線形関数を持っているとしましょうf(n)= an+b
、この関数がO(n 2)に属していることを証明する最良の方法は何Θ(n)
ですか?
ここでは数学的な厳密さは必要ありません。プログラマーの回答が必要です。説明の論理的な方法。
これがまさに数学のQ&AではなくプログラマーのQ&Aに質問を投稿しなかった理由です。
回答:
Big Oh表記(O、Theta、Omega)は、関数の成長率に関するものです。
アルゴリズムを実装するとき、データセットを増やすとランタイムがどのように変化するかという特定の特性があります。アルゴリズムを最適化して、100倍高速に実行できるようになりました。確かに、これは素晴らしいことですが、本質的には同じアルゴリズムです。同様に、数年で、コンピューターは現在の2倍の速度になる可能性があります。
Landau表記は、これらの一定の要因を抽象化します。これは、アルゴリズムがいるかどうか気にしないf
倍の速度別のアルゴリズムとして常にあるg
かもしれない:g
4倍高速に実行するように最適化することができ、またはあなたの代わりに高速なハードウェアを購入することができるかもしれません。この観点から見ると、それらは「同じ」と言うかもしれません。(それは、実際に一定の要因を(常に)無視できるということではありません。)
Big ohは上限を指定します<=
。これはリレーションに似ています。
あなたはそれ1 < 2
が真実であることに同意するでしょう。1
それは他のどの数字よりも小さくてはいけないということですか?確かにそうではありません。より大きい数の無限の量があります1
。
成長率についても同様です。O(n)
は線形に(またはよりゆっくり)成長するすべての関数のセットを示します。O(n^2)
一方、これらの関数はすべて、2次の強制性(またはより遅い)で成長します。線形関数は、2次関数よりもゆっくりと成長することに同意するでしょう。
これが、関数が複数の「Big-oh」クラスに属することができる理由です。
以下は、さまざまな関数との比較です:(Knuthの具象数学から)
左から右に、関数はより速く成長します。
また、は、2> 1であるため、n ^ 2はn ^ 1よりも速く成長します。
「fはgと同じくらい速く成長します」
「fはgと同じくらい遅いか、同じくらい速く成長します」
上記の2つの組み合わせ。関数f
はとして「同等に高速に」成長すると言いg
ます。それは等価関係です。
2つのアルゴリズムとがあるf
としg
ます。
オメガ
を想定すると、予算に関係なく、システムに追加できる一定の量の計算能力はなく、f
常にのように高速で実行されg
ます。
ビッグオハイオ州
と仮定すると、十分なデータがある場合は、システムにどれだけの計算能力を追加してf
もg
、常によりも高速に実行されます。
本当にこれを証明しようとしている場合、関数が必要な条件を満たすことをランダウ記法の定義を使用して示す必要があります。
だから、の値を見つける必要があるc
、d
、n_0
条件が成立するようになっています。
下限については、次の方法でこれを行うことができますc
。
私が完全に大丈夫c
よりも小さいとarbitrarily意的に定義していることを理解することが重要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
。O(n)
は、常に一定の係数内か、n
それ未満であることを意味しn
ます。
この手段で任意の関数ということはΘ(s)
、いずれかのためにs
、また中になりますO(s)
。機能はしている場合にも、Θ(s)
そしてs
いつもより少ない他のいくつかの機能よりもt
、その関数はであるO(t)
が、ありませんΘ(t)
。
完全を期すために、もありますΩ(n)
。場合Θ
を表す==
とO
表し<=
、Ω
表しています>=
。そうan + b
であるΩ(1)
、Θ(n)
とO(n^2)
。
先ほど言ったように、どのクラス多項式が含まれているかは簡単にわかります。次数を見るだけです。他にも簡単に使用できる機能がいくつかあります。
任意の形態の機能a^bn
任意用a
とb
ですΘ(a^n)
。任意の値についてc >= a
、それらはにありO(c^n)
ます。すべての多項式はですO(2^n)
。本質的に、これは指数関数が常に多項式を打ち負かし、指数関数の基底が重要であると言うだけです。
対数は反対です。1つlog_b n
は、Θ(log n)
forにありますb
。つまり、底は対数には関係ありません。これは、対数の異なる基数間の切り替えが定数を乗算するだけなので、理にかなっています。対数関数もあります。O(n)
つまり、対数関数はどの多項式よりも小さくなります(少なくとも1次)。
これらの関数の合計を考えると、最大のものが「勝ちます」。そうn + log n
であるΘ(n)
ので、n
用語が支配的log n
用語を。乗算はより複雑です。CSの場合、知っておく必要があるのnlog n
は、n
との間だけですn^2
。
多くの数学を使用せずに、関数f(n)= an + bを取得し、すべての定数を削除します。したがって、このf(n)= nのようになります。 Θ(n)