分析运行时间的复杂性:
for(i=1; i <= n; i=i*2) for(j=1; j<= n-i; j++) print j;
我的尝试:
记下i,j
:
i: 1 | 2 | …| 2^i |...| 2^log_2(n)=n
j: 1...n-1 | 1...n-2 | | 1...n-2^i|...| 0
所以我得到以下内容:
这是对的吗?我真的不确定变量和中间总和的变化。
答案 0 :(得分:1)
我们将分别查看循环的每个部分。
外部循环可以表示为:
for(i=1; i <= n; i=i*2)
f(n, i)
其中f(n,i)
是复杂O(f)
的内循环。这具有log(n) * O(f)
的复杂性。
for(j=1; j<= n-i; j++)
print j;
由于n
支配n
,因此复杂度为i
。 i
是2的幂,小于n
,所以它们的差异最差n - 1
。
因此,复杂性为log(n) * n
或nlog(n)
。