计算时间复杂度

时间:2016-09-19 13:52:47

标签: time-complexity

有人可以帮助解决以下代码的时间复杂性:

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次。 但我不确定答案。

1 个答案:

答案 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)),因此通常会将其作为渐近复杂度给出。