O(n)vs O(nlogn)时间复杂度

时间:2018-04-13 14:15:15

标签: algorithm time-complexity

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

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

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

2 个答案:

答案 0 :(得分:11)

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

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

因此它通过n + n / 2 + n / 4 ...总计达2n。

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

不要被愚弄,内环是线性的,但不能独立于外环。

答案 1 :(得分:5)

内部循环确实是线性的,但每次迭代都不需要n个步骤,但是x步骤为x的当前值迭代减半,这意味着更精细分析是可能的。您高估了内循环的成本。因此,绑定

O(n log n)

也是正确的,但

O(n)

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

n / 2^i

步骤; O(n)的运行时界限遵循以下事实:分母的总和是geometric series,它收敛于常数2