以下算法的时间复杂度是多少?

时间:2010-08-27 10:31:57

标签: algorithm complexity-theory

for(i=0;i< m; i++)
{

   for(j=i+1; j < m; j++)
   {

      for(k=0; k < n;k++)
      {
         for(l=0;l< n;l++)
         {if(condition) do something}
      }
   }

} 

6 个答案:

答案 0 :(得分:3)

详情:

两个第一个循环将导致(m-1)+(m-2)+(m-3)+ ... + 1次重复,这等于m *(m-1)/ 2。至于后两个循环,它们基本上从0运行到n-1,因此它们需要n ^ 2次迭代。

由于你不知道条件是否会得到满足,那么你会采取最坏的情况,即它总是得到满足。

然后迭代次数为:

M *(M + 1)/ 2 * N ^ 2个* NumberOfIterations(东西)

在O表示法中,常数和较低的度数不是必需的,因此复杂性为:

O(平方公尺* N ^ 2)* O(东西)

答案 1 :(得分:2)

for(i=0;i< m; i++)
{  
   for(j=i+1; j < m; j++)
   {

内部循环将运行((m-1) + (m-2) + ... 1)

= 1 + 2 + 3 + ...m-1 
= m * (m - 1) / 2

for(k=0; k < n;k++)
{
   for(l=0;l< n;l++)
   {

在这种情况下,内环显然运行n * n times


很明显,迭代次数正是

  (m * (m - 1) / 2) * (n * n)
= O(m^2 * n^2)

显然,这是假设的 if(condition) do something 经常运行。

答案 2 :(得分:1)

对我来说看起来像O(m ^ 2 n ^ 2),假设“某事”是恒定时间。

尽管j循环从每个步骤的不同点开始,但ij循环的组合效果仍然是m ^ 2因子。

评估未说明的条件本身通常是(至少)一个恒定的时间操作,所以当然循环不能比O(m ^ 2 n ^ 2)更快 - 当然,除非“某事”包括休息,goto,异常抛出或早期从一个或多个循环中退出的任何东西。

如果由于任何原因,n或m在整个过程中都不是一直的,那么所有的赌注都会被取消。

答案 3 :(得分:1)

我认为“做某事”的时间复杂性是O(S)。

让我们从最内循环开始:它的时间复杂度是O(n * S),因为它做了n次。包裹最内部循环的循环具有O(n) O(n S)= O(n ^ 2 * S)的时间复杂度,因为它执行内循环n次。

包含第二个最内循环的循环具有O(m-i)* O(n ^ 2 * S)的时间复杂度,因为它执行O(n ^ 2 * S)操作m-i次。

现在对于更难的部分:对于0 ... m-1范围内的每个i,我们进行(m-i)* O(n ^ 2 * S)操作。多久时间? (1 + 2 + 3 + ... + m)* O(n ^ 2 * S)。 但是(1 + 2 + ... + m)是arithmetic sequence的总和。因此,总和等于m *(m-1)/ 2 = O(m ^ 2)。

结论:我们做了大约m ^ 2次的O(n ^ 2 * S)操作。整个事物的时间复杂度是O(m ^ 2 * n ^ 2 * S)

答案 4 :(得分:0)

O(m ^ 2 * n ^ 2 *(某事的复杂性))。如果条件和某些东西在恒定时间内执行,那么O(m ^ 2 * n ^ 2)。

答案 5 :(得分:0)

O(m²*n²)*“某事”的复杂性