我正在通过这个问题来计算时间复杂度。
int fun(int n)
{
int count = 0;
for (int i = n; i > 0; i /= 2)
for (int j = 0; j < i; j++)
count += 1;
return count;
}
我的第一印象是 O (n log n),但答案是 O (n)。请帮我理解为什么它是 O (n)。
答案 0 :(得分:6)
内循环执行n
迭代,然后n/2
,然后n/4
,等等。因此内循环迭代的总数为:
n + n/2 + n/4 + n/8 + ... + 1
<= n * (1 + 1/2 + 1/4 + 1/8 + ...)
= 2n
(见Geometric series),因此是O(n)。
答案 1 :(得分:0)
对于输入整数n,
fun()的最里面的语句在以下时间执行。 n + n/2 + n/4 + ... 1
因此,时间复杂度T(n)可以写为
T(n) = O(n + n/2 + n/4 + ... 1) = O(n)
的值也是n + n/2 + n/4 + .. + 1
最外面的循环在O(logn)
中进行迭代,因此O(n)
较高时将被忽略