我被告知这段代码的时间复杂度是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;
}
答案 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)。