函数的大 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的主要内容,如果未能解决你的问题,请参考以下文章

for 循环的大 O 表示法简单问题

重复函数的大 0 符号,C++

嵌套循环的大O时间复杂度

被调用函数的大 O 表示法的时间复杂度

计算使用 C++ std 函数而不是 for 循环的大 O

在 Pandas DataFrame 中反转列顺序的大 O 复杂度是多少?