以下算法O(logn)的空间复杂度如何?

时间:2019-03-28 06:41:06

标签: python algorithm

以下是python代码,用于使用《古德里奇》和《塔玛西娅》一书中的二进制递归来查找元素列表的总和。

    def binary_sum(S, start, stop):
  """Return the sum of the numbers in implicit slice S[start:stop]."""
        if start >= stop:                      # zero elements in slice
            return 0
        elif start == stop-1:                  # one element in slice
            return S[start]
        else:                                  # two or more elements in slice
            mid = (start + stop) // 2
            return binary_sum(S, start, mid) + binary_sum(S, mid, stop)

因此书中指出:

“在每次递归调用时,范围的大小都会被分成两半,并且 因此,递归的深度为1 + logn。因此,二进制和使用O(logn) 额外的空间量。但是,运行时间 二进制和为O(n),因为有2n-1个函数调用,每个函数调用需要恒定的时间。”

据我了解,这是指算法的空间复杂度为O(logn)。但是由于它正在进行2n-1个函数调用,因此python不必为每个函数保留2n-1个不同的激活记录吗?因此,空间复杂度应为O(n)。我想念什么?

3 个答案:

答案 0 :(得分:1)

任何算法的空间复杂度都不取决于否。函数调用。这取决于递归的深度。在以上算法中,递归的深度为O(log n)。

答案 1 :(得分:0)

Space complexity analysis of binary recursive sum algorithm

对该问题有很好的解释

递归算法的空间复杂度取决于递归的深度log(n)

  

为什么递归深度会影响空间?   算法?每个递归函数调用通常需要分配一些   额外的内存(用于临时数据)以处理其参数。在   至少,每个此类调用都必须存储有关其父级的一些信息   致电-​​只知道完成后要返回哪里。想象你   正在执行任务,并且您需要在内部执行子任务   第一项任务-所以您需要记住(或写下来)   您在第一个任务中停止的位置,之后便可以继续   您完成子任务。依此类推,子任务中的子任务...   因此,递归算法将需要空间O(depth of recursion)

答案 2 :(得分:0)

  

它正在进行2n-1个函数调用

并非所有这些都同时出现。函数调用有开始和结束。

  

python不必为每个函数保留2n-1个不同的激活记录吗?

仅活动的激活记录需要占用空间。在任何给定时间都有O(recursion_depth)。