为什么这个算法的Big-O复杂度为O(n ^ 2)?

时间:2015-11-22 19:02:28

标签: algorithm time-complexity big-o complexity-theory asymptotic-complexity

我知道这个算法的大O复杂度是O(n^2),但我无法理解为什么。

int sum = 0; 
int i = 1; j = n * n; 
while (i++ < j--) 
  sum++;

即使我们在开始时设置j = n * n,我们在每次迭代期间递增i并递减j,所以不应该得到的迭代次数远远少于n*n

7 个答案:

答案 0 :(得分:114)

在每次迭代期间,您递增i并递减j,这相当于仅将i递增2.因此,迭代总数为n ^ 2/2且仍为为O(n ^ 2)。

答案 1 :(得分:53)

big-O复杂性忽略了系数。例如:O(n)O(2n)O(1000n)都是相同的 O(n) 运行时间。同样,O(n^2)O(0.5n^2)都是 O(n^2) 的运行时间。

在您的情况下,您每次循环时基本上将循环计数器递增2(因为j--i++具有相同的效果)。因此,您的运行时间为O(0.5n^2),但在删除系数时,这与O(n^2)相同。

答案 2 :(得分:11)

您将完全n*n/2次循环迭代(如果(n*n-1)/2为奇数,则为n。 在大O符号中,我们有O((n*n-1)/2) = O(n*n/2) = O(n*n),因为常数因素并不算数&#34;。

答案 3 :(得分:10)

您的算法等同于

while (i += 2 < n*n) 
  ...

O(n^2/2)O(n^2)相同,因为大O复杂度并不关心常量。

答案 4 :(得分:4)

设m是迭代次数。然后,

i + m = n ^ 2 - m

给出,

m =(n ^ 2-i)/ 2

在Big-O表示法中,这意味着O(n ^ 2)的复杂性。

答案 5 :(得分:4)

是的,这个算法是O(n ^ 2)。

为了计算复杂性,我们有一个表格的复杂性:

O(1) O(log n) 上) O(n log n)
O(N²) 为O(n ^ A) O(一^ n)的 为O(n!)

每行代表一组算法。一组在O(1)中的算法,它也在O(n)和O(n ^ 2)等中,但不是相反的。所以,你的算法实现了n * n / 2个句子。

O(n)&lt; O(nlogn)&lt; O(n * n / 2)&lt; O(N²)

因此,包含算法复杂性的算法集合为O(n²),因为O(n)和O(nlogn)较小。

例如:  对于n = 100,sum = 5000. =&gt; 100 O(n)&lt; 200 O(n·logn)&lt; 5000(n * n / 2)&lt; 10000(N ^ 2)

对不起我的英语。

答案 6 :(得分:0)

  

即使我们在开始时设置j = n * n,我们在每次迭代期间递增i并递减j,所以不应该得到的迭代次数比n * n小很多?

是的!这就是为什么它是O(n ^ 2)。按照相同的逻辑,它是 lot 小于n * n * n,这使得它成为O(n ^ 3)。按类似的逻辑,它甚至是O(6 ^ n)。

big-O为您提供有关上限的信息。

我相信你试图问为什么复杂性是theta(n)或omega(n),但如果你只是想了解大O是什么,你真的需要理解它首先在函数上给出上界