【问题标题】:Space complexity of a recursive algorithm from the CTCI book [duplicate]CTCI书中递归算法的空间复杂度[重复]
【发布时间】:2020-05-01 06:46:28
【问题描述】:

我正在阅读 CTCI 书籍,但无法理解其中的一个示例。他们开始于:

int sum(int n) {
  if (n <= 0) {
    return 0;
  }
  return n + sum(n-1);
}

并说明这是 O(n) 时间和 O(n) 空间,因为每个调用都会添加到调用堆栈并占用实际内存。

下一个例子是:

int f(int n) {
  if (n <= 0) {
    return 1;
  }
  return f(n - 1) + f(n-1);
}

并指出时间复杂度为 O(2^n),空间为 O(n)。虽然我明白为什么时间是 O(2^n),但我不确定为什么空间是 O(n)?他们的解释是“在任何给定时间仅存在 O(n) 个节点”。为什么我们不计算每个调用堆栈占用的空间,就像在第一个示例中一样?

附:在阅读了类似的问题后,我是否应该假设一旦我们开始向后(或向上)递归,堆栈帧的空间就会被回收?

【问题讨论】:

    标签: time-complexity big-o space-complexity


    【解决方案1】:

    与时间复杂度不同,时间复杂度只是运行程序所需的总时间,空间复杂度描述了执行程序所需的空间。所以程序的执行树中有 2n 个节点并不重要。调用堆栈自动折叠并释放使用的额外内存。重要的是调用树的最大深度,对于这个程序来说是 O(n)。但是应该注意的是,递归是一种特殊情况,它在堆栈折叠时自然释放任何已使用的内存。如果内存是在运行时显式分配的,它也应该显式释放。

    关于第一个例子,调用树只是一个深度为 n 的列表,导致相似的 O(n) 复杂度。

    【讨论】:

      猜你喜欢
      • 2015-05-13
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2011-02-12
      相关资源
      最近更新 更多