这个时间的复杂性是什么:
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) 你可以解释一下
答案 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)。希望这有帮助!