【问题标题】:Is best Big O Time efficiency always the same as best Space efficiency for recursive solutions?最佳大 O 时间效率是否始终与递归解决方案的最佳空间效率相同?
【发布时间】:2012-07-07 22:48:32
【问题描述】:

如果递归解决方案最终连续调用自身约 N 次,在返回一个级别之前,空间效率最多为 O(N),因为 N 次调用中的每一个都使用一定数量的堆栈空间。

这是否也意味着时间效率最多也是 O(N),因为递归函数内部的代码类似于运行 ~N 次的内部循环代码?

【问题讨论】:

    标签: algorithm recursion big-o performance


    【解决方案1】:

    除了@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 的循环。
    【解决方案2】:

    不,但你的观察有一些道理 - 基本上,如果你知道任何算法(递归或其他,因为我们不区分这两者;并且没有任何东西可以真正区分它们,它更像是一个风格问题)给定问题的空间复杂度至少为f(n),时间复杂度也必须至少为f(n)

    【讨论】:

    • 这是不准确的。例如,一个数组可以作为集合使用,并且是initialized in O(1)。假设 allocating 内存是O(1)(这对于图灵机来说不正确,但可能适用于某些架构) - 这为空间复杂度比时间复杂度更差的算法提供了可能性
    • 注意:上面的评论是在谈论算法。当谈到问题时,情况就不同了,因为DTIME DSPACE
    【解决方案3】:

    不,因为递归算法的每一步都可能花费比 O(1) 更长的时间。如果每一步都取O(n),那么总时间复杂度就是O(n^2)。

    【讨论】:

    • 您好,抱歉,我已编辑标题以减少误导。我对最好的情况大 O 感兴趣,而不是它们是否总是相同的。对此感到抱歉!
    • 最好,我的意思是时间效率的下限与空间效率的下限相同。例子:如果空间复杂度是O(N),时间效率不可能比O(N)好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多