以下代码的复杂性是什么?

时间:2014-11-17 14:46:16

标签: java algorithm math complexity-theory time-complexity

根据此代码:

for (int i=1; i<=N; i*=2)
{
  for (int j=1;j<=i;j++)
  {
    System.out.println("The value for i is "+i+" and the value for j is "+j);
  }
}

第一个for-loop将运行log(n)次, 起初我想到2n-1为第二个for-loop,但它不适用于奇数。

有什么想法吗? :)

2 个答案:

答案 0 :(得分:4)

  • i = 1时,内部循环将运行1次
  • i = 2时,内循环将运行2次
  • i = 4时,内循环将运行4次
  • ...
  • i = N时,内循环将运行N次

print语句执行1 + ... + N/4 + N/2 + N次,即O(n)。

答案 1 :(得分:2)

你的第一个for循环已经i作为一个系列:

enter image description here

当此系列的最后一个元素为biger或等于N时,第一个循环停止:

enter image description here

x代表第一次循环执行的次数。现在我们正试图找到x

enter image description here

,其中

enter image description here

是的,就像你说的那样:

  

第一个for循环将运行log(n)次

第二个for循环体作为总和运行:

enter image description here

证明您的算法具有O(n)复杂度

如果N是2N-1

之一,则您的打印时间为1, 2, 4, 8, ... , 2^n

这是表面分析,但它可以完成工作。