Big O(logn)ログベースはeですか?


96

バイナリサーチツリータイプのデータ構造の場合、Big O表記は通常O(logn)と表記されます。ログに小文字の 'l'がある場合、これは自然対数で記述されているようにログベースe(n)を意味しますか?簡単な質問で申し訳ありませんが、暗黙の対数を区別するのにいつも問題がありました。


58
他の人が丁寧に指摘したように、それは問題ではありません。すべての対数は、関係する底にのみ依存する定数によって互いに異なります。これらの要素は定数であるため、漸近分析の目的には関係ありません。第二に、暗黙のベースを決定する限り、それはコンテキストに依存します。大まかな目安として、以下を使用します。1.数学者が書くとき、log n彼は自然対数を意味します。2.コンピュータサイエンティストが書くとき、log n彼は2を表します。3.エンジニアが書くとき、log n彼は10を意味します。これらは通常真実です。
ジェイソン、

4
@Jason、別の規則(数学内)では、ln nは自然対数を意味し、log nは10を底としています。lnがフランスの「対数自然」を表すと考えてください。
インターネット男、

2
対数の底は、各ノードが持つ子の数です。バイナリツリーの場合は、2を底とするログです。
ポール、

3
ジェイソン、あなたの答えに感謝します。ログのベースを調査したので(2を想定)、同じ答えが見られました。定数log_10(2)を削除できるため、問題ではないということです。これに関する私の問題は、たとえば、5 log_10(5)<5であるのに対し、5 log_2(5)> 5。 (n)。ベースによっては重要です。したがって、これに対する正しい答えは、ほとんどのコンピュータサイエンスアプリケーションでは、ログは文脈上2を意味するということになると私は本当に思います。
Doug Mead

@jason、私はln(数学​​者の解釈)を使用する方が簡単だと思います;)他の2つの例は妥当です。
ベルフォード2015

回答:


77

big-O()表記で表現すると、どちらも正しくなります。ただし、O()多項式の導出中に、バイナリ検索の場合、log 2のみが正しいです。この区別は、あなたの質問の最初の直感的なインスピレーションだったと思います。

また、私の意見の問題として、O(log 2 N)を書くことは、アルゴリズムのランタイムの派生をよりよく伝えるので、あなたの例にはより良いです。

big-O()表記では、定数係数が削除されています。ある対数の底から別の底への変換には、定数係数の乗算が含まれます。

したがって、定数係数のため、O(log N)はO(log 2 N)と同等です。

ただし、答えに簡単にlog 2 Nとタイプセットできる場合は、より教育的です。二分木検索の場合、big-O()ランタイムの導出中にlog 2 Nが導入されることは間違いありません。

結果をbig-O()表記として表現する前に、違いは非常に重要です。big-O表記を介して通信される多項式を導出する場合、この例では、O()表記を適用する前に、log 2 N 以外の対数を使用することは正しくありません。多項式を使用して最悪のランタイムをbig-O()表記で通信するとすぐに、どの対数を使用してもかまいません。


4
しかし、それはショーに非常に簡単ですlog_2 nしているΘ(log_a n)任意のベースのためa、私は必ず私がベース2を使用すると、「より正確」であるか見ないんだので、。
BCAT

1
Kinopkioとbcat、役立つようにしてくれてありがとう。最初はあまりよく書かれていませんでした。:)
ヒース・ハニカット

2
まあ私は明快さを追加しましたが、あなたが私の答えが人々を混乱させるかもしれないとあなたが思うことは確かに傷つきます。実際、ここでの回答のほとんどはOPの直感を考慮せず、OPに多くのことを教えようとしました。私は競争にそれほど驚かされていません。教育学の低水準にちょっと悲しいです。
ヒースハニカット、

11
「O()多項式の導出中、二分探索の場合、log2のみが正しい。」数学が苦手な場合は-1。x(n)〜O(f(n))の定義は、すべてのn> n_0に対してc *(f(n))<x(n)であるような定数cが存在することを示しています。したがって、定数係数は分析中はまったく関係ありません。
rlbond 2009年

3
log2(x)はlog10(x)/ log10(2)と等しいため、どちらの方法でも導出できます。ログは、厳密にどの時点でも2を底とするものではありません。
rlbond

80

Big O表記は、対数の底の影響を受けません。これは、異なる底のすべての対数が定数因数によって関連付けられるためO(ln n)と同等O(log n)です。

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


2
グラフィックはすっきりしていますが、O()-多項式の導出について考えてください... O()が適用される前に、log-base-2のみがバイナリ検索に適しています。
ヒースフニカット

1
@Heath Hunnicutt:いいえ。log_2 xとは無関係に、任意のベースのlog_b x定数係数によって異なります。c(b)bx
ジェイソン

4
しかし、それが質問とは関係がなく、混乱するだけの役目を果たしているのに、なぜあなたはそれについて話しているのですか?
ホブ、

4
ホッブズ:その事実は、OPが問い合わせを促された理由です。私は彼の考えと答えを結び付けようとしているので、彼はなぜ彼の直感があったのか、なぜそれがO()に当てはまらないのかを理解していますが、ここで学んだことを分析の導出部分に過度に適用していません。誤解の根本原因に対処しない簡潔な回答は、さらなる誤解につながる可能性があります。それは悪い教育学です。
ヒースハニカット、

4
@ヒース・ハニカット:漸近分析をしているなら、それは重要ではありません。Big-Oを投入するために最後まで待つことは、私がすべての対数を愚かな定数で乗算および除算し、すべてのステップで底を変更できるという事実を変更しません。つまり、を含む分析がある場合log_2 nlog_2 nどこにでも行って置き換えるだけで、どこにでもlog_pi 2 * log_2 n / log_pi 2ある分析になってしまいlog_pi 2 * log_pi nます。今、私の分析はの観点からlog_pi nです。
jason、

9

Big-O表記は通常、漸近的に最も高い次数のみを示すように記述されるためn、定数の係数は失われます。異なる対数の底は定数係数に相当するため、不必要です。

そうは言っても、私はおそらくログベース2を想定しています。


@Kinopiko:正確には何が問題なのですか?より正確には、私の答えは実際にあなたや他の人と実際にどのように違うのですか?
Daniel Pryden

ああ、おそらく「係数」の使い方の間違い。明確にするために編集します。
ダニエル・プライデン

それが私の回答の最大の問題でした。また、「まだ影響がある」とはどういう意味かは、少し不明確です。何に影響がありますか?
bcat 2009年

1
あなたの答えは最高次数係数について議論します。あなたが言ったことはそれに関しては正しいですが、それが対数の底が無関係である理由ではありません。その理由は、異なる対数の違いはO()によって吸収される定数であるためです。

1
@キノピコ:OK。私たちは同じことを言っていると思います。O(100)= O(100 * 1)= O(C * 1)= O(1)なので、私はO(100)= O(1)と言います。これは私が定数式が不必要であることの意味です。つまり、順序いずれかの定数は1です
ダニエルPryden

7

どちらも正しいです。これについて考える

log2(n)=log(n)/log(2)=O(log(n))
log10(n)=log(n)/log(10)=O(log(n))
logE(n)=log(n)/log(E)=O(log(n))

2

はい、big-O表記について話すとき、ベースは関係ありません。ただし、実際の検索問題に直面した場合、計算上は問題になります。

ツリー構造に関する直感を開発する場合、それがツリーの高さ、つまりnノードのバイナリツリーでは、ツリーであるため、バイナリ検索ツリーはO(n log n)時間で検索できることを理解しておくと役立ちます。深さはO(n log n)(基数2)です。各ノードに3つの子がある場合でも、ツリーはO(n log n)時間で検索できますが、底が3の対数です。計算上、各ノードが持つ子の数はパフォーマンスに大きな影響を与える可能性があります(例:リンクテキストを参照)

楽しい!

ポール


二分木の高さはlog nであり、n log nではないと言うつもりですか?
セル


1

まず、関数f(n)がO(g(n))であることの意味を理解する必要があります。

正式な定義は次のとおりです。 *関数f(n)はO(g(n))であると言われます| f(n)| <= C * | g(n)| n> kのときはいつでも、Cとkは定数です。*

したがって、f(n)= nのログベースa、ここでa> 1およびg(n)= nのログベースb、ここでb> 1

注:これは、値aおよびbが1より大きい任意の値である可能性があることを意味します。たとえば、a = 100およびb = 3です。

これで、次の結果が得られます。<= C * | nのログベースb | n> kのとき

k = 0を選択し、C = bのログベースaを選択します。

ここで、次のように私たちの方程式ルックス: | n個のログベースA | <= bのログベースa * | nのログベースb | n> 0のとき

右側に注意してください。次の方程式を操作できます。= bの対数底a * | nの対数底b | = | nのログベースb | * bの対数底a = | bの対数底a ^(nの対数底b)| = | nのログベースa |

ここで、次のように私たちの方程式ルックス: | n個のログベースA | <= | nのログベースa | n> 0のとき

式は、n、b、またはaの値が何であっても、制約a、b> 1およびn> 0以外は常に真です。したがって、nの対数底aはO(nの対数底b)であり、a、bは問題ではないため、単純に省略できます。

ここでYouTubeビデオを見ることができます:https : //www.youtube.com/watch?v=MY-VCrQCaVw

あなたはそれに関する記事をここで読むことができます:https//medium.com/@randerson112358/omitting-bases-in-logs-in-big-o-a619a46740ca

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