【发布时间】:2014-05-30 03:21:53
【问题描述】:
我在理解分而治之算法时遇到了一些问题。我已经读过,为了成功地应用递归,你需要有一个“递归的信念飞跃”,你不应该为每一步的细节而烦恼,但我并不满足于仅仅接受递归有效。条件都满足了,因为目前对我来说这似乎很神奇,我想了解它为什么会起作用。
所以我得到了以下在伪代码中找到最大子数组的递归算法:
Find-Maximum-Subarray(A, low, high)
if high == low
return (low, high, A[low])
else
mid = [(low + high)/2]
(left-low, left-high, left-sum) = Find-Maximum-Subarray(A, low, mid)
(right-low, right-high, right-sum) = Find-Maximum-Subarray(A,mid + 1, high)
(cross-low, cross-high, cross-sum) = Find-Max-Crossing-Subarray(A,low, mid, high)
if left-sum >= right-sum and left-sum >= cross-sum
return (left-low, left-high, left-sum)
else if right-sum >= left-sum and right-sum >= cross-sum
return (right-low, right-high, right-sum)
else
return (cross-low, cross-high, cross-sum)
其中 Find-Max-Crossing-Subarray 算法由以下伪代码给出:
Find-Maximum-Crossing-Subarray(A, low, mid, high)
left-sum = -INF
sum = 0
for i = mid down to low
sum = sum + A[i]
if sum > left-sum
left-sum = sum
max-left = i
right-sum = -INF
sum = 0
for j = mid + 1 to high
sum = sum + A[j]
if sum > right-sum
right-sum = sum
max-right = j
return (max-left, max-right, left-sum + right-sum)
现在,当我尝试将此算法应用于示例时,我很难理解所有步骤。
数组被“分解”(使用索引,而不实际更改数组本身)直到高等于低。我认为这对应于第一次调用,因此首先对数组左侧的所有项调用 Find-Maximum-Subarray,直到 high==low==1。然后 (low, high, A[low]) 返回,在这种情况下为 (1, 1, A[1])。现在我不明白这些值在调用的其余部分是如何处理的。
此外,我不明白该算法实际上是如何比较长度 > 1 的子数组的。有人可以向我解释一下,一旦函数的调用之一触底,该算法将如何继续吗?
【问题讨论】:
-
我在另一个线程中的answer 可能会帮助你。它深入到一个好的递归示例中。
标签: algorithm recursion divide-and-conquer