【问题标题】:O(n) vs O(nlogn) Time ComplexityO(n) 与 O(nlogn) 时间复杂度
【发布时间】:2018-04-13 14:15:14
【问题描述】:

我在网上看到了这个时间复杂度的例子,有点困惑。

x = n
while ( x > 0 ) {
    y = x
    while ( y > 0 ) {
        y = y - 1
    }
    x = x / 2
 }

答案为 O(n)。我想知道为什么它不是 O(nlogn)。我之所以这么说是因为外循环看起来是对数的,而内循环看起来是线性的。如果 y=n(而不是 x),那么时间复杂度会是 O(nlogn) 吗?如果是这样,为什么?

【问题讨论】:

标签: algorithm time-complexity


【解决方案1】:

y=y-1 传递了多少时间?这将衡量复杂性,对吗?

  • 当 x=n 时,经过 n 次。
  • 当 x=n/2 时,通过 n/2 次。
  • 当 x=n/4 时,通过 n/4 次。
  • ...

所以它通过了 n + n/2 + n/4... 总和为 2n。

因此总复杂度为 O(n)。

别被骗了,内循环是线性的,但并不独立于外循环。

【讨论】:

    【解决方案2】:

    内部循环确实是线性的,但是每次迭代不采取n步骤,而是将x的当前值迭代减半的x步骤,这意味着可以进行更精细的分析。您高估了内部循环的成本。因此,界

    O(n log n)
    

    也是正确的,但是

    O(n)
    

    是一个较小的界限。通过推理i-th 可以看出较小的界限 内循环的迭代需要

    n / 2^i
    

    步骤; O(n) 的运行时界限源于分母之和是geometric series,它收敛于常数2

    【讨论】:

    • 但是系列 -> 2 不只是作为 n -> ∞,其中表达式本身的总和将为 ∞?
    • @KaranModi 我不确定我是否理解你的评论;该系列从下方收敛,每个单独的部分和小于2
    • 我的错,系列确实收敛了。
    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2013-10-20
    • 2019-12-09
    相关资源
    最近更新 更多