坚持我HW - 需要尝试复杂性
time=0;
for (i=n; i>=1; i = sqrt(i))
for (j=1; j<=i; j++)
time++;
我做了什么 - 第一次循环是这样的: i = n,n ^(1/2),n ^(1/4)... 1 比我们得到的:
n ^(1/2)^ k = 1 如果我记录双方一边得到0 ......我该怎么办?
答案 0 :(得分:0)
我认为某处存在拼写错误,否则如果输入n
不小于1,则为Θ(∞)。对于i == 1
,更新i = sqrt(i)
不会更改i
,这是一个无限循环。)
所以让我们假设它实际上是
time = 0;
for (i = n; i > 1; i = sqrt(i))
for (j = 1; j <= i; j++)
time++;
然后,为了获得嵌套循环的复杂性,您需要为外循环的每次迭代求和内循环的复杂性。在这里,内部循环显然运行i
次,因此我们需要对外部循环中运行的值i
求和。这些值为n, n^0.5, n^0.25, ..., n^(1/2^k)
,其中k
的特征为
n^(1/2^(k+1)) < 2 <= n^(1/2^k)
或等同地
2^(2^k) <= n < 2^(2^(k+1))
2^k <= lg n < 2^(k+1)
k <= lg (lg n) < k+1
k = floor(lg(lg n))
现在仍需要估算从上到下的总和来得到算法的Θ。如果您开始记下n
的几个(大)值的总和,则此估算非常简单。