没有n的for循环的性能测量

时间:2018-12-31 16:58:52

标签: algorithm performance for-loop big-o complexity-theory

我想知道每次不依赖输入地从1到10调用的for循环的复杂性是什么。

这里是一个示例-输入了n:

int count = 0;
int max = n + 1;

for (int a = 1; a < max; a++)
{
   for (int b = 1; b < a; b++)
   {
     for (int c = 1; c < 10; c++)
     {
      count = count + 1
     }
   }
}
return count

所以我在想内部for循环的复杂度为1,而另一个to的复杂度分别为n + 1? => 1 + 1 +(n + 1)(1+(n + 1)(1 + 1 + 1))+ 1 =3n²+ 7n + 7

还是因为十次迭代而为10? => 1 + 1 +(n + 1)(1+(n + 1)(1 + 10 + 10))+ 1 =21n²+ 43n + 25

因此,从根本上讲,离开常数之后,它的复杂度为O(n²)

我是衡量复杂性的新手,所以我真的很感谢每一个帮助。

谢谢

问候和新年快乐

1 个答案:

答案 0 :(得分:0)

如果您的循环始终执行固定的次数,则不会影响复杂性,因为您可以“展开”该循环:

for (int a = 1; a < max; a++)
{
    for (int b = 1; b < a; b++)
    {
        count = count + 1  // c = 1
        count = count + 1  // c = 2
        count = count + 1  // c = 3
        count = count + 1  // c = 4
        count = count + 1  // c = 5
        count = count + 1  // c = 6
        count = count + 1  // c = 7
        count = count + 1  // c = 8
        count = count + 1  // c = 9
    }
}

您获得的程序与第一个程序具有完全相同的语义,并且具有相同的O复杂性。

À提案

“循环展开”是C / C ++编译器使用的优化之一。例如。在GCC中,您可以使用-funroll-loops标志将其打开。

  

-趣味循环

     

展开循环,可以在编译时或进入循环时确定其迭代次数。 -funroll-loops表示-frerun-cse-after-loop。此选项使代码更大,并且可能会或可能不会使它运行得更快。

来源:https://gcc.gnu.org/onlinedocs/gcc-4.5.2/gcc/Optimize-Options.html