【问题标题】:What is the time complexity of this little code?这个小代码的时间复杂度是多少?
【发布时间】:2020-12-06 17:59:57
【问题描述】:

这段小代码的时间复杂度是多少?

int count = 0;
for (int i = n; i > 0; i = i/2) {
    for (int j = 0; j < i; j++) {
        count++;
    }
}

我想知道这段代码的时间复杂度。对我来说,我计算为 O(n log n),因为外循环运行 logn 次,内循环运行 O(n) 次。但我很困惑,因为内循环 j 取决于 i。 那么实际的时间复杂度是多少?为什么?

【问题讨论】:

  • 你的意思是 for (int i = n; i > 0; i /= 2)
  • 代码没有什么“令人困惑”的地方
  • @paulsm4 您是否希望该评论对 OP 有所帮助?
  • @paulsm4 我更正了标题

标签: c algorithm complexity-theory


【解决方案1】:

确切的总和是

n + n/2 + n/4 + ... + 1

这是

n * (1 + 1/2 + 1/4 + ... + 1/n)

众所周知,1/2 的非负幂的总和接近 2,因此总和接近 2*n。结果,复杂度为O(n)i 的下降速度足以避免 linarithmic 的增长。

【讨论】:

    【解决方案2】:
    iteration         | inner loop steps
        0             |        n
        1             |        n/2
        2             |        n/4
        3             |        n/8
        4             |        n/16
        .
        .
        .
        .
        log(n)        |        n/(2^logn) = 1
         
    n + n/2 + n/4 + n/8 ... + 1 = n(1 + 1/2 + 1/4 + ... 1/n) 
    

    per 是 O(n)

    1/2 + 1/4 + 1/8 + ....
    

    收敛到 1。

    【讨论】:

      【解决方案3】:

      n + n/2 + n/4 + ... + 1 = 2n,所以这是 O(n)。

      【讨论】:

      • 你的答案很枯燥,只是一个公式,请在你的答案中多说;-)
      • @Dave - 答案既优雅简洁 - 又完全有意义。您已经准确地解释了为什么正确答案是O(n)没有诉诸任何多余的措辞。干得好!
      猜你喜欢
      • 2017-01-29
      • 1970-01-01
      • 2023-02-26
      • 2016-10-30
      • 2013-10-05
      • 2015-03-31
      • 1970-01-01
      • 2022-11-14
      • 2022-01-13
      相关资源
      最近更新 更多