哪种算法更快O(N)或O(2N)?

时间:2014-09-11 01:42:17

标签: algorithm big-o

谈论大O符号,如果一个算法时间复杂度为O(N)而其他算法是O(2N),哪一个更快?

5 个答案:

答案 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;增长率。

  

<强>证明:

     

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;),他们指的是规范形式。例如:

  • 对数:O(log n)
  • 线性:O(n)
  • 线性:O(n log n)
  • 二次方:O(n 2
  • 指数:O(c n )对于某些固定的c> 1

(这里有一个更全面的清单: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