繁体   English   中英

这段代码的复杂性是什么

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM