有人可以帮助解决以下代码的时间复杂性:
for(i = 0; i <= n; i++)
{
for(j = 0; j <= i; j++)
{
for(k = 2; k <= n; k = k^2)
print("")
}
a / c对我来说,第一个循环将运行n次,第二个循环运行(1 + 2 + 3 ... n)次,第三个循环运行loglogn次。 但我不确定答案。
答案 0 :(得分:0)
我们从内部开始锻炼。考虑最里面的循环:
for(k = 2; k <= n; k = k^2)
print("")
执行print("")
次迭代次数?首先请注意n
是不变的。 k
假设的值是什么序列?
iter | k
--------
1 | 2
2 | 4
3 | 16
4 | 256
我们可以通过多种方式找到这个公式。我用猜测证明得到iter = log(log(k)) + 1
。如果该值已经大于n
,则循环不会执行下一次迭代,因此n
执行的迭代总数为floor(log(log(n)) + 1)
。我们可以用几个值来检查这一点,以确保我们做到了这一点。对于n = 2
,我们得到一个正确的迭代。对于n = 5
,我们得到两个。等等。
下一级执行i + 1
次迭代,其中i
从0变为n
。因此,我们必须计算总和1, 2, ..., n + 1
,这将给出我们最外层和中间循环的迭代总数:这个总和是(n + 1)(n + 2) / 2
我们必须将它乘以内部循环的成本才能获得回答(n + 1)(n + 2)(log(log(n)) + 1) / 2
以获取代码段的总费用。扩展中增长最快的术语是n^2 log(log(n))
,因此通常会将其作为渐近复杂度给出。