【发布时间】:2018-03-05 08:11:53
【问题描述】:
互联网上有很多资源解释了对数因子函数的 Big-O(例如1、2),即O(n log(n))。
我不明白为什么log() 有O(log(n)) 而不是至少O(n)。从下面的递归代码中,log_factorial 本质上被称为 n 次(转换为 log() 被称为 n 次),所以 如果 log() 是 O(n),@987654336 @ 应该是 O(n^2).
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 ) )
}
上网对我没有多大帮助(相反,它让我更加困惑)。 Wikipedia 说 log 的 Big-O 应该取决于精确度:
...计算自然对数(使用算术几何 均值)是 O(M(n) ln n)。这里 n 是精度的位数 其中要计算自然对数,M(n) 是 两个 n 位数相乘的计算复杂度。
为了获得经验答案,我绘制了运行时与 n(下图)的关系图,实际上,对数因子不是二次的。
我显然在这里遗漏了一些东西,希望有人可以向我解释。 如果我的问题是“noob-ish”,请原谅我。
【问题讨论】:
-
你向我们展示的情节看起来很像它可以以
O(N*logN)为界。它显然不是线性的,但增长速度比这快。 -
中位执行时间与递归调用次数有什么关系?
-
你有没有想过为什么计算 log(n) 的复杂度是
log(n)? :) -
@TimBiegeleisen,同意了。该图显然不是线性的也不是二次的 - 它似乎以
O(N*logN)为界,这(有点?)证实了互联网上提到的内容。 -
@alfasin,哦,废话......现在你指出它是如此明显......感谢您的详尽解释!