[英]What is the complexity of this piece of code
我必须确定这段代码的复杂度。 我以为答案是nlogn,但显然是n。 谁能解释为什么会这样吗?
void funct(int n)
{
for (int i = n; i > 0; i /= 2)
for(int j = 0; j < i; j++)
printf("%d\n", j%2);
}
那就是几何级数第一次执行内循环n次。 第二次执行n / 2次。 等等...所以我们有序列:n + n / 2 + n / 4 + ... + 1所以最终公式是:
n*(1 - (1/2)^(log n))/(1/2)
等价于n
看起来这些可以使用Double Sigma来解决:让$
代表sigma 。 所以这个问题是:
$(i=n downto 0 by a factor of 2 )$(j=0 to i-1) 1
其中1
代表单位成本
现在对于内西格玛,它等于1
i
乘以i
现在问题是$(i=n downto 1 by a factor of 2 ) i
这是i
值的总和,即n+n/2+n/4+...+1(when n/2^x=1 or after log(n) terms)+0
或n*(1+1/2+.....log(n) terms)
这是一个收敛的几何级数 。 结果将是n*(1 - (1/2)^(log n))/(1/2)
即O(n)
我确定可以看到,外循环执行了log(n)
次。 内部循环平均执行log(n)/2
次。 因此, printf
语句执行log(n) * (log(n) / 2)
次,等于n / 2
。 因此,代码的复杂度为O(n)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.