我无法理解在这两种情况下如何计算时间复杂度

时间:2017-04-01 07:06:50

标签: algorithm time-complexity

这是第一个算法。它没有任何正确的语法:

for(i=1;i<=n;i++)
  {for(j=1;j<=i;j++)
       for(k=1;k<=100;k++)
        {printf("hello")
         }
        }
      }

在这种情况下,我们通过查看printf语句执行的总次数来计算时间复杂度为O(n ^ 2)。因此,我们将为每个i从1到n添加k循环的次数。

第二段代码:

{int n=(2)^(2)^k //read as 2 to the power 2 to the power k
 for (i=1;i<=n;i++)
 {j=2
  while(j<=n)
  {j=j^2
   printf("hello")
  }
 }
}

这里我们得到时间复杂度为O(n(loglogn))。我们看到第n个循环将执行n(k + 1)次。我们用k的值代替了时间复杂度。

我不明白为什么我们没有添加print语句执行的总次数来计算第二个代码中的时间复杂度,就像我们在第一个代码中所做的那样。我们只看到它在第n个循环中运行了多少次来计算答案。

1 个答案:

答案 0 :(得分:1)

您需要清除基础知识。第一个循环的时间复杂度是 O(N ^ 2),它与printf语句完全无关。它关于你最内层循环的迭代总数

code 1中最内层的循环运行100*(N^2) O(N ^ 2),即使您的代码1为:

for(i=1;i<=n;i++)
  {for(j=1;j<=i;j++)
       for(k=1;k<=100;k++)
        {
         }
        }
      }

因此,只要您的最内层循环没有语句或语句需要 O(1)时间,答案就会保持不变。

对于你的第二个代码:while循环总是运行log(logn)次,外循环总是运行n次,因此时间复杂度 O(nlog(logn)),因为这是最里面(while)循环的迭代总数。