递归因子函数空间复杂度的计算

时间:2016-06-27 11:36:14

标签: algorithm data-structures

如何计算以下代码的空间复杂度,因为我无法做到。

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

3 个答案:

答案 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)。