以下是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)。我想念什么?
答案 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)。