【问题标题】:Time complexity and space complexity of the following piece of code下面这段代码的时间复杂度和空间复杂度
【发布时间】:2020-07-24 23:36:35
【问题描述】:
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

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


【解决方案1】:

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

从算法的结构和递归树的描述都应该清楚,Tn for n > 0由所有 Ti, 0 i n 组成,全部通过一个额外的节点连接。稍加思考,您应该能够看到可以通过以下过程构造 Tn+1:

  • 制作 T 的副本 T'n
  • 将 T' 的根值加一
  • 使 Tn 的根成为 T' 的根的子,形成 Tn+1

通过这种构造,Tn+1 的节点数是 Tn 的两倍,所以时间复杂度为 O(2n)。

你已经回答了你自己关于空间复杂度的问题,但我确认它对应于树的高度,因此缩放为 O(n)。

【讨论】:

  • 好的@John Bollinger,如果我们使用一维数组来存储函数调用的结果,如动态编程概念以减少函数调用,那么空间复杂度也将是数组的 O(n) 和 O(1 ) 对于 Stack 但这里的时间复杂度是多少?
  • 您对此有何看法,@SanjayVerma?调用foo(N) 然后执行什么工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多