两个循环的增长顺序

时间:2019-11-17 11:11:01

标签: java algorithm time-complexity big-o

以下代码中的增长顺序是什么?

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

答案应该是n,但是我不确定如何找出答案。 如何计算这些循环中的增长顺序?

我的假设是外循环运行(log n +1)次。内部循环依赖于外部循环,因为它使用i。但这等于n吗?

1 个答案:

答案 0 :(得分:2)

每次对给定的i执行内部循环时,都会有i+1个迭代。

因为我的值是2 ^ 0、2 ^ 1、2 ^ 2、2 ^ 3、2 ^ 4,...

内部循环的所有执行的迭代总数受以下约束

2 ^ 0 +1 + 2 ^ 1 +1 + 2 ^ 2 +1 + ... + 2 ^ k +1其中2 ^ k <= n

受其约束

2^0 + 2^1 + ... + 2^k + logn

现在我们有了geometric series的总和:

2^0 + 2^1 + ... + 2^k = 2^(k+1) - 1 <= 2n - 1 since 2^k <= n

因此,您有以下限制:

2n - 1 + logn 

O(n)