我对以下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和空间复杂度成比例的时间复杂度是恒定的。 这总是让我感到困惑。
答案 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)