【问题标题】:Why is Big-O of log() "O( log(n) )" and not "O(n)"?为什么 log() 的 Big-O 是“O( log(n) )”而不是“O(n)”?
【发布时间】:2018-03-05 08:11:53
【问题描述】:

互联网上有很多资源解释了对数因子函数的 Big-O(例如12),即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 ) )
}

上网对我没有多大帮助(相反,它让我更加困惑)。 Wikipedialog 的 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,哦,废话......现在你指出它是如此明显......感谢您的详尽解释!

标签: algorithm big-o logarithm


【解决方案1】:

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

您正在尝试推理您未完全指定的算法的 Big-O。没有人知道您(或各种互联网资源)对对数函数的想法是什么。

我很确定每个半体面的 log(n) 实现都会比 O(n) 执行得更好:log(1000000) 不会比 log(1000) 长 1000 倍。

在 cmets 中,考虑到在 O(logn) 中执行 log(n),有一些看似合理的方法,我认为甚至可以有更好的方法。

对于几千范围内的值(如您的图表所示),我什至可以为您提供一个 O(1) 解决方案,其中包含预先计算的日志值表。

【讨论】:

    猜你喜欢
    • 2015-08-28
    • 2011-01-24
    • 1970-01-01
    • 2011-12-12
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多