n ^ 2 log n复杂度

时间:2014-02-02 12:03:34

标签: big-o time-complexity

我只是有点困惑。如果算法的时间复杂度由

给出

enter image description here

大O符号是什么?只需enter image description here或我们保留日志?

5 个答案:

答案 0 :(得分:9)

如果这是算法的时间复杂度,那么它已经是大O符号,所以,是的,保留日志。渐近地,O(n^2)O((n^2)*log(n))之间存在差异。

答案 1 :(得分:5)

理解大O符号的一种简单方法是将实际步数除以具有大O的项,并验证得到一个常数(或小于某个常数的值)。

例如,如果您的算法执行10n²⋅logn步骤:

10n²⋅logn/ n 2 = 10 log n - >在n中不恒定 - > 10n²⋅logn不是O(n²)

10n²⋅logn/(n²·log n)= 10 - >常数在n - >; 10n²⋅logn是O(n²⋅logn)

答案 2 :(得分:2)

你确实保留了日志,因为log(n)会随着n的增加而增加,反过来会增加你的整体复杂度,因为它会成倍增加。

作为一般规则,您只会删除常量。因此,例如,如果你有O(2 * n ^ 2),你只会说复杂度为O(n ^ 2),因为在功能强大两倍的机器上运行它不应该影响复杂性。

以同样的方式,如果你有复杂度O(n ^ 2 + n ^ 2),你会得到上述情况,只是说它是O(n ^ 2)。由于O(log(n))比O(n ^ 2)更优,如果你有O(n ^ 2 + log(n)),你会说复杂度是O(n ^ 2),因为它甚至更少比O(2 * n ^ 2)。

O(n ^ 2 * log(n))不属于​​上述情况,所以你不应该简化它。

答案 3 :(得分:2)

如果某些算法的复杂度= O(n ^ 2),则可以将其写为O(n * n)。是O(n)?绝对不是。所以O(n ^ 2 * logn)不是O(n ^ 2)。你可能想知道的是O(n ^ 2 + logn)= O(n ^ 2)。

答案 4 :(得分:1)

这里有一个正式的数学证明。

让我们定义以下变量和函数:
N - 算法的输入长度,
f(N) = N^2*ln(N) - 计算算法执行时间的函数。

让我们确定这个函数的增长是否由O(N^2)渐近限制。

根据渐近符号[1]的定义,g(x)f(x)的渐近范围,当且仅当:对于x的所有足够大的值, f(x)的绝对值最多为g(x)的正常数倍。也就是说,f(x) = O(g(x))当且仅当存在正实数M和实数x0

|f(x)| <= M*g(x) for all x >= x0 (1)

在我们的案例中,必须存在正实数M和实数N0,以便: |N^2*ln(N)| <= M*N^2 for all N >= N0 (2)

显然,这样的Mx0不存在,因为任何大的M都有N0,这样 ln(N) > M for all N >= N0 (3)

因此,我们证明N^2*ln(N)并非由O(N^2)渐近限制。

参考文献:
1: - https://en.wikipedia.org/wiki/Big_O_notation