该代码的时间复杂度是多少?

时间:2020-03-07 01:39:06

标签: algorithm big-o

这段代码的时间复杂度是多少?

i = n;
  while(i > 1) {
    j = i;
    while (j < n) {
      k = 0;
      while (k < n) {
        k = k + 2;
      }
      j = j * 2;
    }
    i = i / 2;
  }

我尝试分析此代码,发现复杂度为Log^2n * n,我以for循环格式重写了代码,以使查看这样的结果变得更加容易。

for (i = n; i > 1; i = i / 2) // log2n + 1
  {
    for(j = i; j < n; j = j * 2) // log2n + 1
    {
      for (k = 0; k < n; k = k + 2)  // n + 1 times
      {
          cout << "I = " << i << " J = " << j << " and K = " << k << endl;
      }
      cout << endl;
    }
  }

对吗?如果没有,为什么?我是算法的新手,试图理解,但对其他地方一无所知。

1 个答案:

答案 0 :(得分:1)

是的,您的答案是正确的。变量 i 在每一步都减半,从而使外循环为 O(log n) j 在每一步都加倍,使该循环 O(log n),而最里面的 k 循环线性增加,使该循环 O(n)。在一起相乘得到 O(nlog²n)