谈论大O符号,如果一个算法时间复杂度为O(N)而其他算法是O(2N),哪一个更快?
答案 0 :(得分:39)
大O的定义是:
O(f(n))= {g |存在N和c> 0使得g(n)<0。所有n的c * f(n)> N}
在英语中,O(f(n))是最终增长率小于或等于f的所有函数的集合。
所以O(n)= O(2n)。两者都不是&#34;更快&#34;在渐近复杂性方面比另一方面。它们代表相同的增长率 - 即&#34; 线性&#34;增长率。 p>
<强>证明:强>
O(n)是O(2n)的子集:设g是O(n)中的函数。然后有N和c> 0使得g(n)<0。所有n的c * n> N.所以g(n)&lt;所有n的(c / 2)* 2n> N.因此g在O(2n)中。
O(2n)是O(n)的子集:设g是O(2n)中的函数。然后有N和c> 0使得g(n)<0。所有n的c * 2n> N.所以g(n)&lt;所有n的2c * n> N.因此g在O(n)中。
通常,当人们提到渐近的复杂性时(&#34;大O&#34;),他们指的是规范形式。例如:
(这里有一个更全面的清单:Table of common time complexities)
通常你会写O(n),而不是O(2n); O(n log n),而不是O(3 n log n + 15 n + 5 log n)。
答案 1 :(得分:6)
Timothy Shield的answer绝对正确, O(n)和 O(2n)指的是同一组函数,所以一个人不会更快&#34;比另一个。但值得注意的是,更快并不适合在此处应用。
Wikipedia's article on "Big O notation"使用术语&#34;生长缓慢&#34;你可能已经使用了#34;更快&#34;,这是更好的做法。这些算法由 n 增加时的增长方式定义。
人们很容易想象 O(n ^ 2)函数在实践中比 O(n)更快,特别是当 n 时很小或者 O(n)函数需要复杂的转换。符号表示,对于输入的两倍,可以预期 O(n ^ 2)函数的大约是之前的4倍,其中 O(n)< / em>功能大约需要两倍的时间。
答案 2 :(得分:3)
理论上O(N)和O(2N)是相同的。
但实际上,O(N)肯定会缩短运行时间,但不是很重要。当N足够大时,两者的运行时间将相同。
答案 3 :(得分:1)
它取决于渐近符号隐藏的常量。例如,采用3n + 5
步骤的算法位于类O(n)
中。这是一个采用2 + n/1000
步骤的算法。但2n
小于3n + 5
且大于2 + n/1000
...
这有点像询问5
是否小于1到10之间的某个未指定的数字。这取决于未指定的数字。只知道算法以O(n)
步骤运行,并不足以确定采用2n
步骤的算法是否会更快完成。
实际上,情况甚至更糟:你问的是1到10之间的某个未指定数字是否大于1到10之间的其他未指定数字。你从中选择的数字相同并不代表你的数字碰巧选择将是平等的! O(n)
和O(2n)
是算法的集,并且因为Big-O的定义取消了乘法因子,所以它们是相同的集合。集合中的个体成员可能比其他成员更快或更慢,但集合是相同的。
答案 4 :(得分:1)
O(N) 和 O(2N) 对于少量 N 会显示出显着的增长差异,但随着 N 值的增加,O(N) 将主导增长,系数 2 变得不显着。所以我们可以说算法复杂度为 O(N)。
示例:
让我们用这个函数
T(n) = 3n^2 + 8n + 2089
对于 n= 1 或 2,常数 2089 似乎是函数的主要部分,但是对于较大的 n 值,我们可以忽略常数和 8n,而可以只关注 3n^2,因为它将对增长,如果 n 值仍然增加,系数 3 也似乎无关紧要,我们可以说复杂度为 O(n^2)。
详细解释请参考here