函数的大 O 是多少 (log n)^k
Posted
技术标签:
【中文标题】函数的大 O 是多少 (log n)^k【英文标题】:What is the big-O of the function (log n)^k 【发布时间】:2011-11-23 07:07:45 【问题描述】:对于任何 k,函数 (log n)k 的大 O 复杂度是多少?
【问题讨论】:
呃....是哪个,标题中的函数还是正文中的函数? 【参考方案1】:它仍然是(log(n))^2
。对数的幂次方已经是最低/最简单的形式了。
【讨论】:
【参考方案2】:运行时格式为 (log n)k 的任何函数都是 O((log n)k)。该表达式不能使用简单的转换简化为任何其他原始函数,并且很常见的是运行时为 O(n (log n)2) 的算法。具有这种增长率的函数称为 polylogarithmic。
顺便说一下,通常 (log n)k 写成 logk n,所以上述算法的运行时间为 O(n log2 n. 在您的情况下,函数 log2 n + log n 将是 O(log2 n)。
但是,假设 k 是一个常数,任何具有 log (nk) 形式的运行时的函数都有运行时 O(log n)。这是因为 log (nk) = k log n 使用对数恒等式,而 k log n 是 O(log n),因为 k 是一个常数。但是,您应该注意不要盲目地得出 O(log (nk)) 的算法是 O(log n) 的结论;如果 k 是函数的参数或取决于 n,则在这种情况下,正确的 big-O 计算将是 O(k log n)。
根据您工作的环境,您有时会看到符号 Õ(f(n)) 表示 O(f(n) logk n) 表示某个常数 k。这有时称为“soft-O”,用于对数项不相关的上下文中。在这种情况下,您可以说这两个函数都是 Õ(1),尽管这种用法在简单的算法分析中并不常见(事实上,在 Wikipedia 之外,我已经看到它恰好使用过一次)。
希望这会有所帮助!
【讨论】:
关于符号的一个注意事项:在编写log^k n
时应该小心,因为许多随机算法与 log(log(n))
或 log(log(log(n)))
等术语具有复杂性,并且在某些圈子中(例如在运筹学中),作者使用 log^k(n) 来指代对数的重复应用。
@Foo Bah- 这是一个很好的观点。符号 log^* 这样也很奇怪。【参考方案3】:
log(n)
是 O((log(n))^2)
所以整个表达式是 O((log(n))^2)
【讨论】:
你认为log(n)是O((log(n))^2)吗?【参考方案4】:(log n)^k 是:
O((log n)^k) O(n^k) O(n) O(n log n) O(n^1/2) O(n^0.00000002)等等。哪一个对您有意义取决于常量和上下文。
【讨论】:
是的,但只有Θ((log n)^k)
@ypercube:OP 没有要求 big-theta。
是的,从技术上讲,您的答案是正确的。我想这就是为什么你有 +1
@ypercube:也是Θ((log n)^k + 1)
以上是关于函数的大 O 是多少 (log n)^k的主要内容,如果未能解决你的问题,请参考以下文章