问题描述
如何找到嵌套循环的时间复杂度? 另外,如何查找包含多个功能的程序的时间复杂度?
基本上,我对何时添加/乘以时间复杂度感到困惑。
#include <stdio.h>
long pascal(int,int);
int main()
{
int n,m,k,j;
printf ("Enter the height for Pascal's Triangle: ");
scanf("%d",&n);
for(k = 0; k<n; k++)
{
for(j = 0; j < n-k; j++)
{
printf(" ");
}
for(m = 0; m <= k; m++)
{
long f = pascal(k,m);
printf("%ld ",f);
}
printf("\n");
}
return 0;
}
long pascal(int n,int i)
{
if(n == i || i == 0)
return 1;
else
return pascal(n-1,i) + pascal(n-1,i-1);
}
这是我用于打印Pascal三角形的代码。如何找到其时间复杂度?
解决方法
- 您的第一个循环-
for(k = 0; k<n; k++)
运行Θ(n)
。 - 您的第二个循环-
for(j = 0; j < n-k; j++)
作为算术级数运行,因此Θ(n^2)
。 - 您的第3个循环作为第2个循环运行,因此
Θ(n^2)
。 - 您的
pascal
函数运行O(2^n)
,因为它具有2个部分的递归:pascal(n-1,i) + pascal(n-1,i-1);
您可以在此链接中看到完整的解释:https://stackoverflow.com/a/360773/13292734
结论:
- 没有
pascal
函数,时间复杂度为Θ(n^2)
。 - 但是发生时间最长的是函数
pascal
,其时间复杂度为O(2^n/sqrt(n))
。您可以在这里看到为什么是O(2^n/sqrt(n))
而不是O(2^n)
:https://stackoverflow.com/a/26229383/13292734 - 因此时间复杂度为:
O(n^2)*(2^n/sqrt(n))
。或者您可以说:O(n^2)*(2^n)
也是正确的。