O(n)和O(1 + n)之间的实际区别?
O(n)不是O(1 + 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)中有一个解决方案,这是否意味着我做错了什么?
谢谢。
O(1 + n)和O(n)在数学上是相同的,因为你可以直接从形式定义或使用O(a(n)+ b(n))等于O a(n))和O(b(n))。
当然,在实践中,如果你做n + 1件事情(通常依赖于编译器优化/等等)花费的时间比只有n件事要花费更多的时间。 但是,大O符号是讨论这些差异的错误工具,因为它明确抛弃了这种差异。
这不是一个改进,因为BigO
没有描述算法的确切运行时间 ,而是它的增长率 。 因此,BigO描述了一类函数,而不是一个函数。 O(n^2)
并不意味着你的用于输入大小为2
算法将在4
运算中运行,这意味着如果你将应用程序的运行时间绘制成n
的函数,它将渐近地被上限c*n^2
从n0
开始。 这很好,因为我们知道我们的算法对于每个输入大小会有多慢,但我们并不真正知道它的速度有多快。 为什么使用c
? 正如我所说的,我们不关心确切的数字,而是关心函数的形状 - 当我们乘以一个常数因子时,形状保持不变。
O(n)不是O(1 + n)的改进吗?
不它不是。 渐近地,这两个是相同的。 事实上,O(n)与O(n + k)相同,其中k
是任何常数值。