确定这些循环的Big-O运行时

时间:2015-11-07 02:25:38

标签: algorithm big-o

我正在尝试确定这些循环的Big-O运行时。我相信我的答案是正确的,但我想与社区核实。

int sum = 0;
for (int i = 1; i <= n*2; i++ )
   sum++;

我的回答是O(n)

这是因为循环迭代n次2次。我们放弃2并留下n。因此O(n)。

int sum = 0;
for ( int i = 1; i <= n; i++)
   for ( int j = n; j > 0; j /= 2)
      sum++;

我的回答是O(n lgn)

外循环迭代n次。内部循环从n向下迭代到0,但只有一半的项目。这可以作为n的Log base 2。我们删除2并保留log n。内循环(log n)乘以外循环(n),得到O(n lgn)。

int sum = 0;
for ( int i = 1; i <= n; i++)
   for ( int j = i; j <= n; j += 2)
      sum++;

我的答案是O(n ^ 2)

这个很容易。内循环和外循环每次迭代n次。 n x n = n ^ 2。因此O(n ^ 2)。

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

我的答案是O(n ^ 3)

我的答案是否正确?如果没有,我该如何纠正它们?

1 个答案:

答案 0 :(得分:2)

只有最后一个是错的。它应该是O(n⁴)。

您可以这样看:用n * n替换x。操作次数通常为O(x *(x + 1)/ 2)= O(x²)。现在将n * n替换回x

<小时/> 为您带来额外挑战。

你正确地说:

int sum = 0;
for ( int i = 1; i <= n; i++)
   for ( int j = n; j > 0; j /= 2)
      sum++;

是O(n log n)。但是这个怎么样:

int sum = 0;
for ( int i = 1; i <= n; i++)
   for ( int j = i; j > 0; j /= 2)
      sum++;

我只将j = n更改为j = i