fun()的时间复杂度?

时间:2015-11-12 16:54:55

标签: algorithm time-complexity

我正在通过这个问题来计算时间复杂度。

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)。

2 个答案:

答案 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)较高时将被忽略