大O混淆:log2(N)vs log3(N)

时间:2013-12-11 07:03:41

标签: math big-o logarithm

为什么O(log 2 N)= O(log 3 N)?

我不明白这一点。大O不是指某事的上限吗?

log 2 N是否大于log 3 N?当我绘制它们时,log 2 N高于log 3 N.

4 个答案:

答案 0 :(得分:30)

Big O不处理常数因子,Log x (n)和Log y (n)之间的差异是一个常数因子。

换句话说,对数的基数基本上只是修改图上线/曲线的斜率。 Big-O不关心图形上曲线的斜率,只关注曲线的形状。如果你可以通过向上或向下移动其斜率来获得一条曲线来匹配另一条曲线,那么就Big-O符号而言,它们是相同的函数和相同的曲线。

为了尝试透视这一点,也许绘制一些更常见的曲线形状会很有用:

enter image description here

如上所述,只有线条的形状很重要,而不是它的斜率。在下图中:

enter image description here

......所有的线都是直的,所以即使它们的斜率根本不同,它们仍然完全相同,只要大O关心 - 它们都只是O(N),无论斜率如何。使用对数,我们得到大致相同的效果 - 每条线将像上一张图​​片中的O(log N)线一样弯曲,但是改变对数的底部将围绕原点旋转该曲线,因此您将(再次)他有相同的形状的线,但在不同的斜率(所以,再说,就像大O关心,它们都是相同的)。所以,回到最初的问题,如果我们改变对数的基数,我们得到的曲线看起来像这样:

enter image description here

这里可能有点不太明显,所发生的一切都是斜率的不断变化,但这正是这里的差异,就像上面的直线一样。

答案 1 :(得分:14)

这是因为改变对数的基数等于将它乘以常数。而大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))

答案 2 :(得分:2)

这里已经有了一些很好的答案,所以请你仔细阅读。 要理解为什么Log2(n)是O(log3(n)),你需要理解两件事。

1)BigO表示法的含义是什么。我建议您阅读此内容:http://en.wikipedia.org/wiki/Big_O_notation如果您了解此问题,您会知道2n16n+5都是O(N)

2)对数如何工作。 log 2 (N)和log 10 (N)之间的差异将是一个简单的比例,如果你想根据luk32的答案轻松计算。

由于不同碱基的对数只是一个恒定的比例,而大O对于常数乘法因子这样的小事情无动于衷,你会经常发现O(logN)实际上省略了基数,因为任何常数基数的选择(例如2,3,10, e )在这种情况下没有区别。

答案 3 :(得分:1)

这取决于使用O表示法的上下文。当你在算法复杂性推理中使用它时,你对函数的asymptotic behaviour感兴趣,即当它趋向于(加或减)无穷大(或另一个积累点)时它是如何增长/减少的。

因此,f(n) = 3n始终小于g(n) = 1000n时,它们都会显示在O(n)中,因为它们会逐渐增加linearly(根据其表达式)。

对于您发布的对数情况,可以采用相同的推理模式,因为对于常数因子,不同的基数对数不同,但是共享相同的渐近行为。

更改上下文,如果您对计算算法的确切性能感兴趣,并且估算的结果是精确而非近似的,那么您当然更喜欢较低的算法。通常,所有计算复杂度比较都是近似的,因此通过渐近推理来完成。