算法分析中O(1)和O(2)之间有什么区别?

时间:2010-01-04 02:44:01

标签: algorithm complexity-theory big-o

根据大O f(n) <= C*g(n)(意为f(n) = O(g(n))的定义,可以推断:

f(n) <= C
f(n) <= 2C

我认为这两者之间没有太大的区别。我能想到的是:

f(n) = 1 - 1 / n
f(n) = 2 - 1 / n
C = 1

但是这两种复杂性有什么不同,因为两者都是不变的复杂性?

您能否展示一些真实世界代码来演示O(1)和O(2)之间的差异。

8 个答案:

答案 0 :(得分:17)

O(1)O(2)之间没有区别。分类为O(1)的算法为O(2),反之亦然。事实上,对于任何正常数O(c1)O(c2)c1c2

O(c)其中c是一个正常数,只是意味着运行时的界限与输入或问题大小无关。由此可以清楚地(非正式地)O(1)O(2)相等。

正式地,考虑f中的函数O(1)。然后有一个常数cf(n) <= c * 1为所有n。让d = c / 2。然后f(n) <= c = (c / 2) * 2 = d * 2显示fO(2)。同样,如果gO(2),则c为常量g(n) <= c * 2nd = 2 * c。让g(n) <= c * 2 = d = d * 1。然后g显示O(1)O(1) = O(2)。因此{{1}}。

答案 1 :(得分:9)

O(1)和O(2)与任何O(常数值)相同。

关键在于它既不依赖于N的某些功能。

答案 2 :(得分:3)

没有区别。

在下图中,红线代表O(n),绿色曲线代表O(n 2 )。

正如您所看到的红线所示,当2增加时,1x变得微不足道(绿色曲线以更快的速度增长)。这就是Big-O符号试图捕捉的内容; 常量相对没有意义。

答案 3 :(得分:2)

也许它们意味着无论输入大小(通常表示为N),两种算法都在恒定时间内执行,但其中一种算法的速度是其两倍。但这是对大O符号的滥用。

答案 4 :(得分:0)

O(1)和O(2)之间没有区别。

符号的顺序在常量上是唯一的。 O(f( x ))意味着存在一些常数 k ,使得时间小于 k f( 的)。

如果某事是O(2),则存在一些常数 k ,该程序所需的时间小于2 k 。因此,有另一个常数, k '= 2 适用于O(1)。

答案 5 :(得分:0)

O(1)和O(2)之间没有区别。实际上你不会使用这种表示法。它更像是O(N)或O(n ^ 2),O(log(N))等。这只是算法量级的指示。换句话说,O(1)会在时间上保持不变。 O(N)在项目数(N)中是线性的,O(n ^ 2)在时间上是指数的,等等。

答案 6 :(得分:0)

Big-O表示法通常用于算法复杂度的渐近分析,即分析算法在n向无穷大增加时的表现。在这种情况下,函数f(n)的n中的最高阶项将是函数的主要部分。

因此,当用big-O表示时,n中的低阶项通常从函数中删除(例如,f(n)= 2n ^ 2 + 4将导致O(n ^ 2)渐近大-O复杂性)。

如果最高项是常数而不依赖于n,那么所有这些常数实际上都是渐近相同的,通常简单地简化为O(1)。

因此,O(2)将被视为等同于O(1)。

答案 7 :(得分:-1)

您通常不会写O(2)或O(2n),而是写O(1)和O(n)。不同之处在于实际速度,例如5s vs 10s。我发现你的问题有点令人困惑。