如何嵌套具有复杂度O(n)的循环?

时间:2019-10-09 15:35:08

标签: algorithm for-loop

给出:

for (int i = 1; i <= n;  i *= 2) {
  for (int j = 0; j < i; j++) {
    // Statement(s) that take(s) constant time
  }
}

运行时间复杂度= O(n)

解释为: enter image description here

我知道外部循环为log(n),内部循环为O(n)。 但是为什么时间复杂度不是O(n log n)?为什么是O(n + log n)

2 个答案:

答案 0 :(得分:0)

部分和计算正确。但是,尽管结果确实为O(n),但总执行时间的解释尚不清楚。 通过执行内部语句会消耗实际时间,并且这些语句的执行次数由循环定义。局部和的方法已经考虑了两个循环(i = 1的1个时间单位,i = 2的2个时间单位,i = 4的4个时间单位等),并且总共内部语句将执行O(n)次,如部分和计算所示。因此,总时间为O(n)*O(constant for the internal statements)=O(n)。我看不出有任何理由在此处的计算中包括O(logn)

答案 1 :(得分:0)

外部循环运行log(n)次。但是,每次都不会在O(n)中运行内部循环。如解释中所示,如果i = 1,则内部循环运行1次。如果为i = 2,则内部循环运行2次。如果为i = 4,则内部循环运行4次。因此,运行时间总数为T(n) = 1 + 2 + 4 + ... + 2^log(n)

现在,简化T(n)

T(n) = 2^(log(n)+1) - 1 = 2^log(n) * 2 - 1 = 2n - 1 = Theta(n)