Time complexity 给定嵌套循环的时间复杂度

Time complexity 给定嵌套循环的时间复杂度,time-complexity,Time Complexity,有人告诉我,这段代码的时间复杂度是O(n),你能解释一下它是怎么做到的吗。外部循环的时间复杂度为logn,内部 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; } intfun(intn) { 整数计数=0; 对于(int i=n;i>0;i/=2) 对于(int j=0;j

有人告诉我,这段代码的时间复杂度是O(n),你能解释一下它是怎么做到的吗。外部循环的时间复杂度为logn,内部

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;
}
intfun(intn)
{
整数计数=0;
对于(int i=n;i>0;i/=2)
对于(int j=0;j
一旦您了解了函数的功能,这实际上非常简单

内部循环基本上将i添加到计数中。因此,您可以将此处的代码简化为:

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

在n=1000的示例中,第一个循环计数缺失。它应该是(i:1000 count:1000),(i:500 count:1500)。。。