查找时间复杂度,何时添加/相乘

问题描述

如何找到嵌套循环的时间复杂度? 另外,如何查找包含多个功能的程序的时间复杂度?

基本上,我对何时添加/乘以时间复杂度感到困惑。

#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)也是正确的。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...