【发布时间】:2012-07-07 22:48:32
【问题描述】:
如果递归解决方案最终连续调用自身约 N 次,在返回一个级别之前,空间效率最多为 O(N),因为 N 次调用中的每一个都使用一定数量的堆栈空间。
这是否也意味着时间效率最多也是 O(N),因为递归函数内部的代码类似于运行 ~N 次的内部循环代码?
【问题讨论】:
标签: algorithm recursion big-o performance
如果递归解决方案最终连续调用自身约 N 次,在返回一个级别之前,空间效率最多为 O(N),因为 N 次调用中的每一个都使用一定数量的堆栈空间。
这是否也意味着时间效率最多也是 O(N),因为递归函数内部的代码类似于运行 ~N 次的内部循环代码?
【问题讨论】:
标签: algorithm recursion big-o performance
除了@Ben 的回答之外,还有“tail recursion”的情况,其中当前堆栈帧被删除并替换为被调用者的堆栈帧,但仅当调用者的最后一个操作是返回被调用者的结果时.这可能导致 O(n) 时间函数在以完全函数式语言实现时具有 O(1) 空间。
【讨论】:
unsigned long factorial(unsigned long n) { if (n == 0) return 1; return n*factorial(n-1); } 被 gcc 重写为带有 -O3 的循环。
不,但你的观察有一些道理 - 基本上,如果你知道任何算法(递归或其他,因为我们不区分这两者;并且没有任何东西可以真正区分它们,它更像是一个风格问题)给定问题的空间复杂度至少为f(n),时间复杂度也必须至少为f(n)。
【讨论】:
O(1)(这对于图灵机来说不正确,但可能适用于某些架构) - 这为空间复杂度比时间复杂度更差的算法提供了可能性
不,因为递归算法的每一步都可能花费比 O(1) 更长的时间。如果每一步都取O(n),那么总时间复杂度就是O(n^2)。
【讨论】: