二进制和如何使用O(log n)空间?

时间:2015-09-06 18:14:33

标签: algorithm recursion

我正在阅读数据结构和算法书,在递归章节中,我遇到了以下算法:

def binary_sum(S, start, stop):
    if start >= stop:
        return 0
    elif start == stop-1:
        return S[start]
    else:
        mid = (start + stop) // 2
        return binary_sum(S, start, mid) + binary_sum(S, mid, stop)

作者认为这比线性和更有效:

def linear_sum(S, n):
    if n == 0:
        return 0
    else:
        return linear_sum(S, n-1) + S[n-1]

因为在迭代的每一步,我们将求和的范围减半(在中间分开),这意味着我们占用O(log n)空间。图片如下:

我的理解是,当我们递归时,对递归步骤的调用会暂停执行,并且其激活记录仍保留在内存中。难道这并不意味着我们实际上占用了带有binary_sum的2^n内存空间吗?

enter image description here

谢谢,

1 个答案:

答案 0 :(得分:2)

作者是正确的,因为调用堆栈的深度是对数限制的。

在您提供的示例中,每次最多可以在堆栈上进行4次调用。他们并非都在附近。当我们开始执行1:2时,我们已经完成0:1并将其从堆栈中删除。同样,我们完成0:2,然后开始2:4。当我们执行2:4时,我们不会为0:2使用任何空格,因为它已完成。在我们完成目前正在处理的工作之前,我们也不会将任何空间用于4:8之类的未来通话。