时间给定嵌套循环的复杂性

时间:2015-06-24 14:42:37

标签: time-complexity

我被告知这段代码的时间复杂度是O(n),请你解释一下它是怎么回事。外循环的时间复杂度是log n,inner?

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;
}

1 个答案:

答案 0 :(得分:2)

一旦你理解了这个功能的作用,这实际上很容易。

内循环基本上将i添加到count。所以你可以在这里减少代码:

int fun(int n) {
 int count = 0;
 for (int i = n; i > 0; i /= 2)
  count += i;
 return count;
}

所以现在你拥有的是它减半我并将这一半加起来。 如果你继续这样做,你最终会得到一个接近n的数字。如果你用i和count的无限精确浮点表示来实现它,你实际上会得到n(尽管它会带你无限量的步骤)。

例如,让我们看看n = 1000,这些是将要采取的步骤:

i: 500    count: 500
i: 250    count: 750
i: 125    count: 875
i: 62     count: 937
i: 31     count: 968
i: 15     count: 983
i: 7      count: 990
i: 3      count: 993
i: 1      count: 994

最后计数中丢失的6个是在i = 125/2,i = 31/2,i = 15/2,i = 7/2,i = 3/3且i = 1时的舍入错误/ 2。

所以你可以看到,该函数的复杂性几乎正好是n,这肯定会使它成为O(n)。

相关问题