web-dev-qa-db-ja.com

Big Oの混乱:log2(N)とlog3(N)

なぜO(log2N)= O(logN)?

分かりません。ビッグOは何かの上限を意味しないのですか?

ログしない2ログよりも大きいNN?それらをグラフ化するとき、ログ2Nは対数の上N.

18
Daver Muzaffar

Big Oは一定の要因、およびLogの違いを扱いませんバツ(n)とログy(n)は定数係数です。

少し言い方を変えると、対数の底は基本的にグラフ上の線/曲線の傾きを変更するだけです。 Big-Oは、グラフの曲線の傾きに関係なく、曲線のshapeにのみ関係します。勾配を上下にシフトすることで1つの曲線を別の曲線と一致させることができる場合、Big-O表記で気になる限り、それらは同じ関数と同じ曲線です。

これを遠近法で表現するには、おそらく、より一般的な曲線形状のいくつかを描くと便利です。

enter image description here

上記のように、線の形状だけが重要であり、その傾きは重要ではありません。次の図では:

enter image description here

...すべての直線は直線であるため、傾きが根本的に異なっていても、big-Oが気になる限りはすべて同じです。傾きに関係なく、すべてO(N)です。対数を使用しても、ほぼ同じ効果が得られます。各線は前の図のO(log N)線のように湾曲しますが、対数の底を変更すると、その曲線が原点を中心に回転するので、(再び)線のshapeは同じですが、傾斜が異なります(したがって、big-Oが扱う限り、それらはすべて同じです)。したがって、元の質問に戻ると、対数の底を変更すると、次のような曲線が得られます。

enter image description here

ここでは、発生しているのが勾配の一定の変化だけであることが少しわかりにくいかもしれませんが、上記の直線の場合と同様に、ここでの違いは正確です。

31
Jerry Coffin

対数の底を変更することは、定数を掛けることに等しいからです。そして、ビッグOは定数を気にしません。

log_a(b) = log_c(b) / log_c(a)

したがって、log2(n)からlog3(n)に取得するには、それを1 / log(3) 2で乗算する必要があります。

つまり、log2(n) = log3(n) / log3(2)です。

log3(2)は定数およびO(cn) = O(n)であるため、O (log2(n)) = O (log3(n))

14
luk32

ここにはすでに良い答えがありますので、それらも読んでください。 Log2(n)がO(log3(n))である理由を理解するには、2つのことを理解する必要があります。

1)BigO表記の意味は何ですか。これを読むことをお勧めします: http://en.wikipedia.org/wiki/Big_O_notation これを理解していれば、_2n_と_16n+5_はどちらもO(N)

2)対数のしくみログの違い2 (N)とログ10(N)は単純な比率になり、luk32の回答に従って必要に応じて簡単に計算できます。

異なるベースのログは一定の比率でのみ異なり、Big Oは定数の乗算係数のような小さなことに無関心なので、O(logN)が実際にベースを省略しているため、定数ベース(2、3、10、eなど)を選択しても、このコンテキストでは違いはありません。

2
RichardPlunkett

これは、O表記が使用されるコンテキストに依存します。アルゴリズムの複雑さの推論でそれを使用しているとき、あなたは関数の 漸近的振る舞い に興味があります。すなわち、それが無限大(または別の累積点)になる傾向があるときにどのように成長/減少するか。

したがって、f(n) = 3nは常にg(n) = 1000nよりも小さいのに対し、(式に従って)漸近的にlinearlyになるため、両方ともO(n)に表示されます。

定数の因数によって異なる底の対数は異なるが、同じ漸近的な動作を共有するため、投稿した対数の場合にも同じ推論パターンをとることができます。

コンテキストを変更し、見積もりが正確で概算ではない場合にアルゴリズムの正確なパフォーマンスを計算することに関心がある場合は、もちろん低い方を優先します。一般に、すべての計算の複雑さの比較は近似であるため、漸近的な推論を介して行われます。

1
rano