【问题标题】:time complexity calculation for two for loops with connecting variables具有连接变量的两个 for 循环的时间复杂度计算
【发布时间】:2014-02-02 05:49:36
【问题描述】:

这会是什么时间复杂度:

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

为此,我认为
1.外循环将运行logn次
2. 内循环也将运行 logn 次。
因为我认为内循环 j 与 k 有关。所以 k 运行了多少,j 的运行时间也是如此。
所以总 = O(logn * logn)

但在文本中,他们给出了总计 = O(2n-1)。
你能解释一下吗

【问题讨论】:

  • 随机注释 - 我会谨慎对待任何将运行时间列为 O(2n-1) 而不立即将其列为 = O(n) 的材料。

标签: algorithm for-loop time-complexity


【解决方案1】:

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

当 k 为 2 (sum++) 时运行 2 次​​p>

当 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

【讨论】:

    【解决方案2】:

    这个问题很容易通过忘记外部循环的存在而首先查看内部循环的复杂性来解释。假设内部循环运行'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)。希望这会有所帮助!

    【讨论】:

    • 根据您的说法 M=Log(n)+1。你指的是外循环吗?
    • 是的,外循环会运行Log(n)+1次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多