多項式実行時間に対するn * log nおよびn / log n


12

Θ n log n より速く、Θ n / log n より遅いことを理解しています。どのような私が理解するのは困難であることは、実際に比較する方法であるΘをN ログN Θ nは/ログN Θ nはFどこ0 < F < 1ΘnΘnログnΘn/ログnΘnログnΘ(n/logn)Θ(nf)0<f<1

たとえば、私たちはどのように決めるんΘ nは2 / 3)、またはΘ nは1 / 3Θ(n/logn)Θ(n2/3)Θ(n1/3)

このような場合の手続きに向けていくつかの指示があります。ありがとうございました。

回答:


3

いくつかのグラフを描画するだけで、うまくいきます。Wolfram Alphaは、これらの種類の調査に最適なリソースです。

方程式

グラフ

このリンクによって生成されます。グラフでは、log(x)は自然対数であることに注意してください。これが、1つのグラフの方程式が少しおかしいように見える理由です。



Raphaelに同意することとは別に、この図はより良いアイデアを与えてくれます。さらに大きな範囲を選択すると、2番目の機能が消えて混乱を招く可能性があります。
phant0m

9

2 nの逆数です。同じように 2 のn速く任意の多項式よりも成長する n個のkかかわらず、どのように大規模な有限の kがある、ログインnは任意の多項式関数より遅く成長する n個のkかかわらず、どのように小さなAのゼロ以外の、正の kがあります。ログn2n2nnkkログnnkk

vs n k k < 1の場合: n / log n vs n / n 1 kn/ログnnkk<1n/ログnn/n1k

as は大きいnに対してn / log n > n kk < 1および大きいnに対してn1k>ログnnn/logn>nkk<1n


3

多くのアルゴリズムでは、定数が異なる場合があり、データサイズが小さいほど定数が速くなったり遅くなったりすることがあり、アルゴリズムの複雑さによって順序付けされません。

とはいえ、超大規模なデータサイズのみを考慮すると、どちらが最終的に勝利し、その後、O(n^f)より高速であるO(n/log n)ため0 < f < 1

アルゴリズムの複雑さの大部分は、最終的に高速であるアルゴリズムを決定することである従ってことを知っているO(n^f)よりも高速であるO(n/log n)ため0 < f < 1、しばしば十分です。

一般的な規則は、anyのlog n乗算(または除算)に比べて、乗算(または除算)が最終的に無視できるn^fことf > 0です。

これをより明確に示すために、nが増加するとどうなるかを考えてみましょう。

   n       n / log n         n^(1/2)
   2        n/ 1              ?
   4        n/ 2             n/ 2
   8        n/ 3              ?
  16        n/ 4             n/ 4
  64        n/ 6             n/ 8
 256        n/ 8             n/16
1024        n/10             n/32

どちらがより急速に減少するかに注目してください。これは、あるn^f列。

f1に近かったとしても、n^f列の開始は遅くなりますが、nが2倍になると、分母の変化率は速くなりn/log nますが、列の分母は一定の割合で変化するように見えます。

特定のケースをグラフにプロットしてみましょう

ここに画像の説明を入力してください ここに画像の説明を入力してください

ソース:Wolfram Alpha

私が選択したO(n^k)、このようなk非常に1に近い(です0.9)。最初O(n^k)は遅くなるように定数も選択しました。ただし、最終的には「勝つ」ことに注意してくださいO(n/log n)


n / log nは

それはちょっとしたタイプミスでしたが、それが最初の意味でした。とにかく、n^k最初はより遅くなるように定数が選択されていても、最終的にはより高速であることを示す、より適切なグラフを追加しました。

3

と考えてくださいnfnn1fn2/3=n/n1/3

nlognvs.nn1f.

lognnεε>0


1

実行時間を比較するときは、nの大きな値を使用して比較することが常に役立ちます。私にとって、これはどの機能が遅いかについての直感を構築するのに役立ちます

あなたの場合、n = 10 ^ 10とa = .5を考えてください

O(n/logn) = O(10^10/10) = O(10^9)
O(n^1/2) = O(10^10^.5) = O(10^5)

したがって、O(n ^ a)はO(n / logn)よりも高速です。0<a <1の場合、1つの値しか使用していませんが、複数の値を使用して関数に関する直感を構築できます


1
書いてO(10^9)はいけませんが、直観を構築するためにいくつかの数字を試すことについての主なポイントは正しいです。

不合格。これは正しくありません。バイアスがかけられている可能性のある単一のn定数を置き換えました。異なる定数を選択した場合、アルゴリズムをより良く見せることができます。ビッグO表記は、長期的に高速化するトレンドを確立するために使用されます。これを行うには、nが小さいほど遅くても、大きいnの方が速いことを示すことができる必要があります。

ありがとう。複数の値の一部と大きな数字を検討する追加されました

ある定数aに対してf(a)> g(a)であるからといって、必ずしもO(f(x))> O(g(x))を意味するわけではないことに注意してください。これは直感を構築するのに役立ちますが、厳密な証明を作成するには不十分です。この関係が成り立つことを示すために、1つの大きなnだけでなく、すべての大きなnに対してこれが真であることを示さなければなりません。同様に、正の次数<1のすべての多項式について真であることを示す必要があります

1

させる fg「fはgより漸近的に遅くなる」ことを示す場合、次の多対数の簡単なルールを使用できますか?関数:

nα1ログnα2ログログnα3nβ1ログnβ2ログログnβ3α1α2α3<β1β2β3

タプル間の順序関係は辞書式です。すなわち210<35 そして 210>25

あなたの例に適用:

On/ログn110

On2/32/300

O(n1/3)(1/3,0,0)

(1/3,0,0)<(2/3,0,0)<(1,1,0)O(n1/3)O(n2/3)O(n/logn)

You could say: powers of n dominate powers of log, which dominate powers of log log.

Source: Concrete Mathematics, p. 441

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.