这个算法的运行时间复杂度是多少

时间:2012-12-18 21:23:30

标签: algorithm math complexity-theory big-o

此算法的时间复杂度是什么:

sum = 0
i = 1

while (i < n) {

    for j = 1 to i {
        sum = sum + 1
    }

    i = i*2;
}

return sum

我知道while循环是O(logn),但for循环的复杂性是多少?是O(n)还是O(logn)

1 个答案:

答案 0 :(得分:7)

分析这种方法的一种方法是计算内循环的迭代次数。在第一次迭代中,循环运行一次。在第二次迭代中,它运行两次。它在第三次迭代时运行四次,在第四次迭代时运行八次,更通常在第k次迭代时运行2次 k 次。这意味着内循环的迭代次数由

给出
  

1 + 2 + 4 + 8 + ... + 2 r = 2 r + 1 - 1

其中r是内循环运行的次数。如您所述,r大致为log n,这意味着此求和结果为(近似)

  

2 log n + 1 - 1 = 2(2 log n ) - 1 = 2n - 1

因此,内循环在O(n)中的所有迭代中完成的总工作量。由于程序总共执行运行外循环的O(log n)工作,因此该算法的总运行时间为O(n + log n)= O(n)。请注意,我们不会将这些术语加在一起,因为O(log n)项是纯粹在维护外循环时完成的工作总量,而O(n)项是纯粹由工作完成的工作总量。内循环。

希望这有帮助!