如何计算以下代码的空间复杂度,因为我无法做到。
somefunct(n)
{
if(n==0)
return 1;
else
return n * somefunct(n-1)
}
以及如何计算下面的时间复杂度
int somefunct(int n)
{
if(n<=2)
return 1;
else
return (somefunct(floor(sqrt(x)))+x);
}
答案 0 :(得分:0)
我认为,一个函数调用的空间复杂度应该简单地乘以递归调用的数量,以获得完整算法(程序)的实际空间复杂度,因为所有堆栈都需要空间。
一个函数调用的空间复杂度是一(1)因为存在单个变量并且将有n + 1个调用,因此空间复杂度将为n + 1。
就顺序而言,它可以称为O(n)。
答案 1 :(得分:0)
如果我们只是查看堆栈中消耗的空间,我们会对您的递归方法进行n + 1
调用,因此我们使用等于O(n)
的渐近内存量。
快速回顾一下,如果我们有一些存储常量内存量的函数,那么空间复杂度将为O(1)
。值得注意的是,恒定的内存量是指某些与算法无关的硬编码常数。
所以,例如,如果我们有一些函数存储了像int myVar = n
这样的数字,那么就不会被认为是常量内存,而是O(lg(n))
位
因此,考虑到这一点,让我们来看看你的递归算法。每次调用函数时,我们都会将2个内容推送到调用堆栈中:
指向函数的指针
论点
函数指针是一个恒定的空间量,因为实际的指针永远不会改变。然而,争论相对于n
不断变化。更具体地说,参数的上限为O(lgn)
位。
现在,我们知道单个函数调用将消耗c * O(lgn)
位。由于我们需要调用此n + 1
次,我们会观察:
c * O(lgn) + c * O(lg(n-1)) + c * O(lg(n-2)) + ... + c * O(1)
因此,我们可以得出结论,空间复杂度为O(nlg(n))
位。
此函数消耗O(n)
个空格或O(nlgn)
个空格。
答案 2 :(得分:0)
空间复杂度:O(n)调用堆栈
时间复杂度:O(sqrt(n))因为每次递归调用减少到sqrt(n)。