根据大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)之间的差异。
答案 0 :(得分:17)
O(1)
和O(2)
之间没有区别。分类为O(1)
的算法为O(2)
,反之亦然。事实上,对于任何正常数O(c1)
和O(c2)
,c1
为c2
。
O(c)
其中c
是一个正常数,只是意味着运行时的界限与输入或问题大小无关。由此可以清楚地(非正式地)O(1)
和O(2)
相等。
正式地,考虑f
中的函数O(1)
。然后有一个常数c
,f(n) <= c * 1
为所有n
。让d = c / 2
。然后f(n) <= c = (c / 2) * 2 = d * 2
显示f
为O(2)
。同样,如果g
为O(2)
,则c
为常量g(n) <= c * 2
,n
为d = 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
增加时,1
和x
变得微不足道(绿色曲线以更快的速度增长)。这就是Big-O符号试图捕捉的内容; 常量相对没有意义。
答案 3 :(得分:2)
也许它们意味着无论输入大小(通常表示为N),两种算法都在恒定时间内执行,但其中一种算法的速度是其两倍。但这是对大O符号的滥用。
答案 4 :(得分:0)
O(1)和O(2)之间没有区别。
符号的顺序在常量上是唯一的。 O(f(
如果某事是O(2),则存在一些常数 k ,该程序所需的时间小于2 k 。因此,有另一个常数, k '= 2
答案 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。我发现你的问题有点令人困惑。