具有连接变量的两个for循环的时间复杂度计算

时间:2014-02-01 21:27:54

标签: algorithm for-loop time-complexity

这个时间的复杂性是什么:

for(k=1;K<=n;k*=2)
   for(j=1;j<=k;j++)
     sum++

为此,我认为是 1.外环将运行登录时间
2.内环也会运行记录时间。
因为我认为内环j与k有关。那么k运行多少,同样也是j的运行时间。
所以总数= O(logn * logn)

但在文本中他们给出了总数= O(2n-1) 你可以解释一下

2 个答案:

答案 0 :(得分:3)

当k为1(sum ++)运行1次

当k为2(sum ++)运行2次

当k为4(sum ++)运行4次

当k为n = 2 ^ k(sum ++)运行2 ^ k次

所以我们必须计算

1 + 2 + 4 + ... + 2 ^ k = 2 ^ 0 + 2 ^ 1 + 2 ^ 2 + .... + 2 ^ k =(1 - 2 ^(k + 1))/ (1-2)

因为我们把n = 2 ^ k这样:

k = log(n)

2 ^(log(n))= n ^(log(2))

2 * 2 ^ k -1 = 2 * n - 1

答案 1 :(得分:0)

这个问题最容易通过忘记外部循环并首先查看内部循环复杂性来解释。假设内循环运行'M'次...然后'sum ++'操作的总数将是,

1 + 2 + 4 + ... + 2 ^(M-1)

通过注意这是由全1组成的二进制数,该和可以减少到'2 ^(M)-1'。现在的问题是什么是M?你已经弄明白了,M = log(n)+1(+1是因为循环必须至少运行一次)。将此插入内循环复杂性会让我们失望,

2 ^(log(n)+1)-1 = 2 * n - 1。

因此整个循环按比例缩放为O(2n-1)。希望这有帮助!