以下代码的时间复杂度和空间复杂度

时间:2020-04-12 11:08:26

标签: c function recursion time-complexity space-complexity

double foo(int n)
{
    int i;
    double sum;
    if(n == 0)
    {
        return 1.0;
    }
    else
    {
        sum = 0.0;
        for(i = 0; i < n; i++)
        {
            sum += foo(i);
        }
        return sum;
    }

}

我已经弄清楚了该函数的空间复杂度,即O(n),但我仍然坚持如何计算时间复杂度。我还制作了递归树以查找空间复杂度,但无法计算如何计算时间复杂度。有人可以帮助我理解它并对其进行可视化吗。

这是递归树。

1 个答案:

答案 0 :(得分:3)

您提供的图形对于可视化算法的时间缩放非常有帮助。考虑以下问题:对于输入<,递归树T n 和T n +1 之间是什么关系? em> n 和 n +1?或等效地,给定T n ,如何构造T n +1

从算法的结构及其递归树的描述中应该清楚, n > 0的T n 由所有的T i ,0 <= i < n 组成,它们都通过一个附加节点相连。稍加思考,您应该可以看到可以通过以下过程构造T n +1

  • 复制T n
  • 的T'
  • 将T'的根值增加一个
  • 将T n 的根作为T'根的子代,形成T n +1

通过这种构造,T n +1 的节点数是T n 的两倍,因此时间复杂度按O(2 n )缩放。

您已经回答了有关空间复杂性的问题,但是我确认它与树的高度相对应,因此缩放为O( n )。