计算嵌套循环的时间复杂度

时间:2016-09-23 09:25:08

标签: c time-complexity big-o nested-loops

关于Big O时间复杂度分析我已经坚持了几天的测试得到了这个问题:

以下是C代码:

   if ( A > B ) {
       for ( i=0; i<n^2/100; i++ ){     //1
           for ( j=n^2; j>i; j-- ){     //2
               A += B;}}
   }
   else {
       for ( i=0; i<2n; i++ ){         //3   
           for ( j=3n; j>i; j-- ){     //4
               A += B;}}
   }

我的第一直觉是这个算法会有一个大的O O(n 2 和嵌套的for循环等等但它不是多个选择答案。试图手动计算每个循环迭代,但在每个内循环(2和4)中考虑到变化i的问题。也难以将其作为求和来写。

1 个答案:

答案 0 :(得分:0)

考虑A > B的第一种情况。对于由外循环迭代的每个n^2 - i值,内循环执行等于i的多次迭代。考虑n = 2i = 1n^2 = 4和内循环迭代j = 4, j = 3, j = 2,三次迭代,与我们的发现一致。

因此,内环的迭代总数是所有n^2 - i的总和,其中i0变为floor(n^2/100) - 1。我们来定义k := floor(n^2/100) - 1。然后这个总和等于kn^2 - k(k+1)/2。替换k代表的表达式,我们恢复[floor(n^2/100) - 1]n^2 - [floor(n^2/100) - 1][floor(n^2/100)]/2。这不超过(n^2/100 - 1)n^2 - (n^2/100 - 1)(n^2/100)/2。我们可以通过乘以n^4/100 - n^2 - n^4/20000 + n^2/200 = n^4(1/100 - 1/20000) - n^2(1 - 1/200)。由此可以看出,第一种情况的时间复杂度为O(n^4)。实际上,它也是Omega(n^4)Theta(n^4)

A <= B的情况下,分析类似。很容易证明第二种情况的时间复杂度为O(n^2)Omega(n^2),因此Theta(n^2)

因此,我们可以自信地说:

  • 最坏情况下的时间复杂度为O(n^4);
  • 最佳时间复杂度为Omega(n^2);
  • 这些边界中的每一个实际上都可以作为Theta边界给出。