为什么这段代码的时间复杂度是 O(n) 而不是 O(log n)
Why time complexicity of this code is O(n) instead of O(log n)
以下代码的时间复杂度为O(n log n)
我认为对于外循环 log n
但对于内循环 n。
所以,O(n logn )
x = n
while ( x > 0 ) {
y = n
while ( y > 0 ) {
y = y - 1
}
x = x / 2
}
但是下面代码的时间复杂度是O(n)
x = n
while ( x > 0 ) {
y = x
while ( y > 0 ) {
y = y - 1
}
x = x / 2
}
为什么上面代码的时间复杂度是O(n)?
因为内循环的迭代次数减少了与x
减少相同的比例。迭代的总数将始终约为 2n - 1
(当 n
是 2 的幂时它是准确的,它对其他数字有一点偏差)。 Big-O 忽略了总和的系数和低阶分量,所以这是 O(n)。
例如,当n == 16
时,外循环的第一次迭代执行内循环的16次迭代。第二次迭代执行 8,然后执行 4,依此类推。所以总数是16+8+4+2+1 == 31
.
以下代码的时间复杂度为O(n log n) 我认为对于外循环 log n 但对于内循环 n。 所以,O(n logn )
x = n
while ( x > 0 ) {
y = n
while ( y > 0 ) {
y = y - 1
}
x = x / 2
}
但是下面代码的时间复杂度是O(n)
x = n
while ( x > 0 ) {
y = x
while ( y > 0 ) {
y = y - 1
}
x = x / 2
}
为什么上面代码的时间复杂度是O(n)?
因为内循环的迭代次数减少了与x
减少相同的比例。迭代的总数将始终约为 2n - 1
(当 n
是 2 的幂时它是准确的,它对其他数字有一点偏差)。 Big-O 忽略了总和的系数和低阶分量,所以这是 O(n)。
例如,当n == 16
时,外循环的第一次迭代执行内循环的16次迭代。第二次迭代执行 8,然后执行 4,依此类推。所以总数是16+8+4+2+1 == 31
.