アルゴリズムの時間の複雑さ:対数の底を述べることは重要ですか?


19

対数の塩基間の唯一の定数が存在するので、書き込みにだけ申し分ないf(n)=Ω(logn)とは対照的に、Ω(log2n)、または任意の塩基があるかもしれませんか?


回答:


63

対数がどこにあるかによります。それが単なる係数である場合、大きなOまたはθ使用すると定数を乗算できるため、違いはありません。

あなたが取る場合はO(2logn)その後、ベースが重要です。基数2にはO(n)だけがあり、基数10には約O(n0.3010)ます。


5
私はこれが唯一のような何かを思い付くために起こっていると思います。数値をn-to-the-what-it-is-isではなく2clogbnとして表現する理由はわかりません(おそらく計算の中間段階として)。2logn2clogbnn
デビッドリチャービー

7
「定数では定数が重要」の+1
トログナンダー

50

漸近的な表記は定数因子の忘れであり、任意の2つの対数は、一定の係数によって異なるので、ベースは違いはありません:logan=Θ(logbn)すべてについてB > 1。そのため、漸近表記を使用する場合、対数の底を指定する必要はありません。a,b>1


13
=の代わりにを見るのが好きです=
Nayuki

16
標準表記では使用しているのではないかと心配しています。=
ユヴァルフィルマス

4
@YuvalFilmus標準表記は誤解を招くものであり、他のすべての標準とはまったく異なり、アルゴリズムの複雑さをそれに非常に類似したものから完全に異質に思わせます。「標準表記法」は、より良く、同様に明確なソリューションよりも悪いソリューションを支持する理由になることはありません。(とにかく、シンボルの意味は通常コンテキストから明確です。)
wizzwizz4

7
@ wizzwizz4一般的な慣行が優れた理由です。効率的なコミュニケーションを促進します。それが私たち全員が英語のスペルの癖に我慢している理由です。
ユヴァルフィルマス

3
時には、ちょうどより明確そこにあまりにも多くのものがあるログのn = Θ ログのb nでnloganΘ(nlogbn)logan=Θ(logbn)
JiK

15

logxy=1logyx and logxy=logzylogzx, so loganlogbn=lognblogna=logab. As logab is positive constant (for all a,b>1), so logan=Θ(logbn).


8

In most cases, it's safe to drop the base of the logarithm because, as other answers have pointed out, the change-of-basis formula for logarithms means that all logarithms are constant multiples of one another.

There are some cases where this isn't safe to do. For example, @gnasher729 has pointed out that if you have a logarithm in an exponent, then the logarithmic base is indeed significant.

I wanted to point out another case where the base of the logarithm is significant, and that's cases where the base of the logarithm depends directly on a parameter specified as input to the problem. For example, the radix sort algorithm works by writing out numbers in some base b, decomposing the input numbers into their base-b digits, then using counting sort to sort those numbers one digit at a time. The work done per round is then Θ(n+b) and there are roughly logbU rounds (where U is the maximum input integer), so the total runtime is O((n+b)logbU). For any fixed integer b this simplifies to O(nlogU). However, what happens if b isn't a constant? A clever technique is to pick b=n, in which case the runtime simplifies to O(n+lognU). Since lognU = logUlogn, the overall expression simplifies to O(nlogUlogn). Notice that, in this case, the base of the logarithm is indeed significant because it isn't a constant with respect to the input size. There are other algorithms that have similar runtimes (an old analysis of disjoint-set forests ended up with a term of logm/2+2 somewhere, for example), in which case dropping the log base would interfere with the runtime analysis.

Another case in which the log base matters is one in which there's some externally-tunable parameter to the algorithm that control the logarithmic base. A great example of this is the B-tree, which requires some external parameter b. The height of a B-tree of order b is Θ(logbn), where the base of the logarithm is significant in that b is not a constant.

To summarize, in the case where you have a logarithm with a constant base, you can usually (subject to exceptions like what @gnasher729 has pointed out) drop the base of the logarithm. But when the base of the logarithm depends on some parameter to the algorithm, it's usually not safe to do so.

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