问题:求数组A的和最大的非空连续子数组
使用分治策略的求解方法
1.假设数组为A[low,high],以中间值为mid划分中规模相同的两个数组A[low,mid],A[mid+1,high]
那么数组A的非空连续子数组只有可能出现在下面三种情况的数组中
1.A[low,mid]
2.跨越中点mid的子数组A[i,j](low<i<mid,mid<j<high)
3.A[mid+1,high]
我们只需要分别求出这三种情况下非空连续子数组的最大值然后进行比较取最大值即可。
其中任何跨越中点的子数组都有两个子数组A[i,mid],A[mid+1,j]组成,因此我们只需要找出形如A[i,mid]和A[mid+1,j]的最大子数组,并将其合并即可。
过程FIND-MAX-CROSSING-SUBARRAY接收数组A和下标low,mid,high为输入,返回一个下标元组划定跨越重点的最大子数组的边界,并且返回最大子数组中值的和。
FIND-MAX-CROSSING-SUBARRAY(A,low,mid,high)
left-sum = -∞
sum = 0
for i = mid donwto low
sum = sum + A[i]
if sum>left-sum
left-sum = sum
max-left = i
right=sum = -∞
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(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-right,right-sum) = FIND-MAXIMUM-SUBARRAY(A,mid+1,high)
(cross-low,cross-high,cross-sum) = FIND-MAXIMUN-SUBARRAY(A,low,mid,high)
if left-sum >= right-sum and left-sum >= cross-sum
return (left-low,left-high,left-sum)
elseif 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-SUBARRAY 函数的伪代码详细展示了这一过程。
718

被折叠的 条评论
为什么被折叠?



