我在网上遇到了这个时间复杂的例子,我有点困惑。
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)?如果是这样,为什么?
答案 0 :(得分:11)
y=y-1
传递了多少时间?这将衡量复杂性,对吗?
因此它通过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
。