嵌套for循环的时间复杂度

时间:2020-09-22 23:04:32

标签: algorithm time-complexity big-o

给出以下嵌套的for循环:

for (int i=n; i>1; i=i/2):
    for (int j=i; j<n; j=j*2)
        # O(1) expression

整个循环的时间复杂度是多少?我的答案是O(log(n)* log(n)),但不确定是否正确。

1 个答案:

答案 0 :(得分:1)

这是使用格言的好地方

如有疑问,请由内而外!

也就是说,首先进行最内层的循环,然后用表示其正在执行多少工作的表达式替换它,然后重复执行直到完成。

在您的情况下,最里面的循环是

for (int j=i; j<n; j=j*2)
    # O(1) expression

现在,这可以做多少工作?为了回答这个问题,让我们考虑一下循环是如何工作的。在每次迭代中,j的值是之前的两倍。由于j从i开始,所以j取的值将是i,2i,4i,8i等,更一般地说,在循环的第k次迭代中,j的值将是2 k ·一世。一旦该值等于或超过n,循环就会终止,

2 k ·i = n

2 k = n / i

k = lg(n / i)

所以这意味着我们将运行Θ(log(n / i))迭代循环。如果将其替换为原始循环,则将剩下以下代码:

for (int i=n; i>1; i=i/2):
    Do Θ(log (n / i)) work;

那最终要完成多少整体工作?好了,外循环将在i = n时运行一次,然后在i = n / 2时运行一次,然后在i = n / 4时运行一次,依此类推,所以完成的总工作量是

Θ(log(n / n)+ log(n /(n / 2))+ log(n /(n / 4))+ ... + log(n / 1))

=Θ(log 1 + log 2 + log 4 + log 8 + ... + log n)

=Θ(log 2 0 + log 2 1 + log 2 2 + log 2 3 + ... +日志2 log n

Θ(0 +1 + 2 + ... + log n)

请记住0 + 1 + 2 + ... + k = k(k + 1)/ 2 =Θ(k 2 ),所以这里要做的总工作是

Θ(0 +1 + 2 + ... + log n)

= Θ(log 2 n)

得出这个答案的关键技术是从内部开始,将对数与重复将大小加倍的循环迭代次数以及1 + 2 + ... + k的公式联系起来。