这段代码的复杂性是什么?

时间:2015-06-17 18:46:05

标签: c complexity-theory

我必须确定这段代码的大O复杂性。 我认为答案是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);
}

3 个答案:

答案 0 :(得分:8)

那个几何级数 内循环第一次执行 n 次。 第二次执行 n / 2 次。 等等... 所以我们有序列: n + n / 2 + n / 4 + ... + 1 所以最终的公式是:

n*(1 - (1/2)^(log n))/(1/2)

相当于 n

答案 1 :(得分:1)

看看这些可以使用双西格玛解决: 让$代表sigma。 所以这个问题是:

$(i=n downto 0 by a factor of 2 )$(j=0 to i-1) 1

其中1代表单位成本

现在对于内部sigma来说,它是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)

这是一个收敛Geometric progression。结果将是n*(1 - (1/2)^(log n))/(1/2),即O(n)

答案 2 :(得分:0)

外部循环,因为我确定你可以看到执行log(n)次。内循环平均执行log(n)/2次。因此,printf语句执行log(n) * (log(n) / 2)次,等于n / 2。所以代码的复杂性是O(n)。