我必须确定这段代码的大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);
}
答案 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)。