互联网有很多资源解释Big-O的日志因子功能(例如1,2),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)
查找互联网对我没什么帮助(相反,它让我更加困惑)。 Wikipedia说log_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(下图)的关系,实际上,对数因子不是二次方程式。
我显然在这里遗漏了一些东西,希望有人可以向我解释。 请原谅我,如果我的问题是'noob-ish'。
答案 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)解决方案。