三个for循环的大O表示法

时间:2014-11-23 22:35:21

标签: java big-o time-complexity

以下代码的复杂性是什么?它会是N ^ 2 * log(n)吗?

for (int m = 1; m <= n; m++)
{
   for (int k = m; k >= 1; k--)
   {
      for (int i = 1; i <= k; i++)
      {
          //do something here
      }
    }
 }

感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

给定循环体的运行时间O(C),最内层循环需要多长时间? O(C*k)

第二个循环需要多长时间? O(C*(1+2+3+...+m)) = O(C*m²)

整个代码snipplet需要多长时间? O(C*(1²+2²+3²+...+n²)) = O(C*n³)

对于求和多项式,请参阅Faulhaber's formula

答案 1 :(得分:1)

第一个循环执行n次。 第二个循环执行n / 2次。 第三个循环执行k / 2次,相当于n / 4次。

这给你一个O(n ^ 3)的复杂性。

经验测试:

#include <iostream>

using namespace std;

int main () {
    int n = 1000;

    long first = 0, second = 0, third = 0;

    for (int m = 1; m <= n; m++)
    {
        first++;
       for (int k = m; k >= 1; k--)
       {

          second++;
          for (int i = 1; i <= k; i++)
          {
              third++;
          }
        }
     }

    cout << first << " " << second << " " << third << endl;

    return 0;
}

结果:

1000 500500 167167000

答案 2 :(得分:0)

如果您使用Sigma表示法,则可以提出以下内容:

enter image description here