【发布时间】:2011-11-23 07:07:45
【问题描述】:
对于任何 k,函数 (log n)k 的大 O 复杂度是多少?
【问题讨论】:
-
呃....是哪个,标题中的函数还是正文中的函数?
标签: algorithm math complexity-theory big-o logarithm
对于任何 k,函数 (log n)k 的大 O 复杂度是多少?
【问题讨论】:
标签: algorithm math complexity-theory big-o logarithm
它仍然是(log(n))^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) 来指代对数的重复应用。
log(n) 是 O((log(n))^2) 所以整个表达式是 O((log(n))^2)
【讨论】:
(log n)^k 是:
等等。哪一个对您有意义取决于常量和上下文。
【讨论】:
Θ((log n)^k)
Θ((log n)^k + 1)