我想知道每次不依赖输入地从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²)
我是衡量复杂性的新手,所以我真的很感谢每一个帮助。
谢谢
问候和新年快乐
答案 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