【发布时间】:2014-11-10 22:28:17
【问题描述】:
我不理解使用分治模式的问题:寻找最大子数组问题。有人可以建立一棵树来检查我的递归,以使我了解每个递归调用和每个步骤中发生的情况吗?在使用分而治之方法的合并排序中,我了解到数组首先被分解为最小的子数组。完成划分后,我们开始逐步从基础到顶部合并。但在这个问题中:finding maximum subarray 我不明白组合步骤。如果数组被分割,那么 i 必须被组合回来。我首先编写算法,然后在代码行之后使用\* *\ 提出问题作为注释。
在这个完整的问题中:书上说 6 到 12 是组合步骤,但我不明白这个分割的数组是如何组合的。有人能画出好图或照片来解释整个过程吗?
Consider an array for this example, A = [-3,2,-1,3]
Find-Maximum-Subarray(A,low,high)
1) if high == low
2) return(low, high, A[low])
3) else mid = floor[(low+high)/2]
4) (left-low,left-high,left-sum)= Find-Maximum-Subarray(A,low,mid)
/*这是对 Find-Maximum-Subarray 的递归调用,因此程序将不会继续进行,它将继续调用自身,最后一步将是左低将被签名数组的第一个索引和左高也将是第一个索引,left-sum 将是 A[1] 现在 i 在下一行代码中划分更右子数组 */
5) (right-low,right-high,right-sum)= Find-Maximum-Subarray(A,mid+1,high)
6) (cross-low,cross-high,cross-sum)= Find-Max-Crossing-Array(A,low,mid,high)
7) if left-sum >= right-sum and left-sum >= cross-sum
8) return (left-low,left-high,left-sum)
9) elseif right-sum >= left-sum and right-sum >= cross-sum
10) return (right-low,right-high,right-sum)
11) else
12) return (cross-low,cross-high,cross-sum)
Find-Max-Crossing-Array(A,low,mid,high)
1.1)left-sum = -infinity
1.2)sum=0
1.3)for i= mid downto low
1.4) sum=sum+A[i]
1.5) if sum>left-sum
1.6) left-sum = sum
1.7) max-left= i
1.8)right-sum= -infinity
1.9)sum =0
2.0)for j = mid+1 to high
2.1) sum=sum+A[j]
2.2) if sum>right-sum
2.3) right-sum= sum
2.4) max-right= j
2.5)return(max-left, max-right, left-sum+right-sum)
【问题讨论】: