O(log n)澄清

时间:2019-01-23 10:04:49

标签: performance time-complexity big-o

O(log n)周围有很多问题,其实际含义是什么,而不是试图再次公开。

但是,在这个特定答案https://stackoverflow.com/a/36877205/10894153上,这张图片对我来说毫无意义:

enter image description here

话虽这么说,但鉴于该答案已获得100票以上的赞成票,并且已经投票超过2年,并且没有任何评论表明可能有任何问题,因此我认为我误会了一些内容,因此请在此处进行澄清(和由于声誉低下,我无法发表评论。

主要,我不理解为什么O(log(n))10n == 1024。这不应该是32,并显示为32^2 = 1024吗?

显然,这对O(n * log(n))也有影响,但只需要了解为什么O(log(1024)) = 10

1 个答案:

答案 0 :(得分:1)

该表是正确的,除了标题可能会引起误解,因为它们下面的值对应于big-O内部的表达式,而不是big-O本身。但这是可以理解的,因为O表示法的含义是不考虑乘法常数。

log(n)也会发生类似的情况。 log表示法还具有忽略对数函数的 base 的含义。但这在这种情况下很好,因为:

log_b(n) = log_2(n)/log_2(b)                 ; see below why this is true

表示函数log_b()1/log_2(b)只是一个乘积常量,即log_2()

并且由于该表是故意强调big-O表示法不考虑乘法常数的事实,因此可以很好地假设其中的所有日志都基于2

特别是,O(log(1024))可以解释为log_2(1024),因为10才是2^10 = 1024


要验证上面的方程式,我们需要检查

log_2(n) = log_2(b)log_b(n)

根据log的定义,我们必须看到n在严格意义上是2,即

n = 2^{log_2(b)log_b(n)}

但右侧是

{2^{log_2(b)}}^{log_b(n)} = b^{log_b(n)} = n

再次定义(应用两次)。