我只是有点困惑。如果算法的时间复杂度由
给出
大O符号是什么?只需或我们保留日志?
答案 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)
显然,这样的M
和x0
不存在,因为任何大的M
都有N0
,这样
ln(N) > M for all N >= N0 (3)
因此,我们证明N^2*ln(N)
并非由O(N^2)
渐近限制。