时间和空间的复杂性

时间:2012-05-21 05:02:44

标签: algorithm asymptotic-complexity

我对以下2个案例中的时间和空间复杂性有疑问

  

块引用

案例I:

Recurion:Factorial计算。

int fact(int n)
{
    if(n==0)
      return 1;
    else
      return (n*fact(n-1));
}

这里为什么时间复杂度变为2 * n,空间复杂度与n成正比。

  

案例II:

迭代: -

int fact(int n)
{
    int i, result = 1;
    if(n==0)
    result = 1;
    else
         {
           for(1=1;i<=n;i++)
              result*=i;
         }
     return (result);
}

与n和空间复杂度成比例的时间复杂度是恒定的。 这总是让我感到困惑。

3 个答案:

答案 0 :(得分:1)

如果我的推理有误,请有人纠正我:)

对于空间复杂性,这是我的解释:

对于递归解决方案,将有n个递归调用,因此将使用n个堆栈;每个电话一个。因此O(n)空间。这不是迭代解决方案的情况 - 只有一个堆栈,你甚至没有使用数组,只有一个变量。因此空间复杂度为O(1)

对于迭代解决方案的时间复杂度,n循环中有for次乘法,因此宽松界限为O(n)。可以假设每个其他操作是单位时间或恒定时间,而不影响算法的整体效率。对于递归解决方案,我不太确定。如果每一步都有两个递归调用,您可以将整个调用堆栈视为平衡二叉树,并且节点总数将为2*n - 1,但在这种情况下我不太确定。

答案 1 :(得分:1)

来自:https://cs.nyu.edu/~acase/fa14/CS2/module_extras.php

空间复杂性

下面我们将比较对迭代和递归因子函数的三种不同调用,并查看如何使用内存。请记住,我们声明的每个变量都必须在内存中保留空间来存储它的数据。因此,最简单形式的算法的空间复杂度是使用的变量数。因此,在这种最简单的情况下,我们可以使用以下公式计算近似空间复杂度:

空间复杂度=函数调用次数*每次调用的变量数

答案 2 :(得分:0)

时间复杂性:程序在运行期间执行的(机器)指令数称为计算机科学中的时间复杂度。

空间复杂度:这实际上是算法所需的存储器单元数。

情况1:在程序中递归计算阶乘,因此会有一个直接调用函数而不会有回溯,因此时间复杂度变为2 * n。

谈到空间复杂性,在程序执行过程中会声明n个堆栈,所以它是n。

案例2:这种情况非常简单,你在for循环中进行了n次迭代,因此时间复杂度为n

迭代解决方案不是这种情况 - 只有一个堆栈,你甚至不使用数组,只有一个变量。因此空间复杂度为O(1)