为什么log()“O(log(n))”的Big-O而不是“O(n)”?

时间:2018-03-05 08:11:53

标签: algorithm big-o logarithm

互联网有很多资源解释Big-O的日志因子功能(例如12),O(n log(n))

我不明白为什么log()O(log(n))而不是O(n)。从下面的递归代码中,log_factorial基本上称为n次(转换为log()被称为n次),因此 if {{ 1}} log()O(n) 应该是 log_factorial

O(n^2)

查找互联网对我没什么帮助(相反,它让我更加困惑)。 Wikipedialog_factorial <- function (n) { # Return the log of factorial(n) for any integer n > 0 if (n <= 1) return (0) return ( log(n) + log_factorial( n - 1 ) ) } 的Big-O应该取决于精度

  

...计算自然对数(使用算术几何   mean)是O(M(n)ln n)。这里n是精度的位数   哪个是自然对数,而M(n)是   计算复杂性乘以两个n位数字。

为了获得经验答案,我绘制了运行时间与n(下图)的关系,实际上,对数因子不是二次方程式。 Runtime in ms vs n

我显然在这里遗漏了一些东西,希望有人可以向我解释。 请原谅我,如果我的问题是'noob-ish'。

1 个答案:

答案 0 :(得分:0)

TL; DR:没有办法告诉Big-O log(n),只能告诉log(n)的具体实现。

您试图推断出您未完全指定的算法的Big-O。没有人知道你(或各种互联网资源)对于对数函数的实现。

我非常确定每一个不错的log(n)实现都会比O(n)执行得更好:log(1000000)不会比log(1000)长1000倍。

在评论中,给出了在O(logn)中执行log(n)的合理方法,我认为甚至可以有更好的方法。

对于数千范围内的值(如图表所示),我甚至可以给你一个带有预先计算的日志值表的O(1)解决方案。