【问题标题】:Finding Time Complexity, when to add/multiply them查找时间复杂度,何时添加/相乘
【发布时间】:2020-08-12 15:15:06
【问题描述】:

如何求嵌套循环的时间复杂度? 还有,如何求一个包含多个函数的程序的时间复杂度?

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

#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);
}

这是我用来打印帕斯卡三角形的代码。如何求其时间复杂度?

【问题讨论】:

  • 时间复杂度是程序正在执行的“步数”(直到一个常数因子/偏移量)。因此,您在添加步骤时添加“复杂性”,并在它们相乘时将它们相乘。当你有一个嵌套循环时,显然内循环中的步数乘以外循环运行的次数。除非这些数字不是恒定的并形成某种系列。
  • 这是否回答了您的问题:stackoverflow.com/questions/11032015/… ?
  • 在您的内部循环中,您首先执行n-k 步骤,然后执行k 步骤 - 乍一看就是n 步骤,并且当您重复此 n 次时,此是 O(N²) 次迭代。但是,您随后会调用一个递归函数,这会增加复杂性。

标签: c time time-complexity complexity-theory


【解决方案1】:
  • 您的第一个循环 - for(k = 0; k&lt;n; k++) 运行 Θ(n)
  • 您的第二个循环 - for(j = 0; j &lt; n-k; j++) 作为算术级数运行,所以它是 Θ(n^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) 也是正确的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 2022-01-22
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多