不是O(n)对O(1 + n)的改进?
这是我对差异的看法:
O(N):
for i=0 to n do ; print i ;
O(1 + n):
a = 1;
for i=0 to n do ; print i+a ;
......只会减少到O(n)对吗?
如果目标时间复杂度为O(1 + n),但我在O(n)中有一个解, 这是否意味着我做错了什么?
感谢。
答案 0 :(得分:4)
O(1 + n)和O(n)在数学上是相同的,因为您可以直接从formal definition证明或使用O(a(n)+ b(n))相等的标准规则到O(a(n))和O(b(n))中的较大者。
在实践中,当然,如果你做n + 1件事情(通常,依赖于编译器优化/等)需要的时间比你只做n件事要长。但是大O符号是谈论这些差异的错误工具,因为它明确地抛弃了这样的差异。
答案 1 :(得分:4)
这不是一项改进,因为BigO
并未描述算法的确切运行时间,而是增长率。因此,BigO描述了一类函数,而不是单个函数。 O(n^2)
并不意味着您输入大小2
的算法将在4
操作中运行,这意味着如果您将应用程序的运行时间绘制为函数n
从c*n^2
开始,它会从n0
开始渐近上界。这很好,因为我们知道每个输入大小的算法会慢多少,但我们并不确切知道它的速度有多快。为什么要使用c
?因为正如我所说,我们并不关心确切的数字,而是关注函数的形状 - 当我们乘以一个常数因子时,形状保持不变。
答案 2 :(得分:2)
不是O(n)对O(1 + n)的改进?
不,不是。渐渐地,这两个是相同的。实际上,O(n)与O(n + k)相同,其中k
是任何常数值。