算法导论学习-分治算法-最大子数组问题

该博客介绍了如何使用分治策略来解决寻找数组中和最大的非空连续子数组的问题。通过将数组划分为两半,分别计算左右两侧及跨越中点的最大子数组,然后比较三者取最大值,实现递归求解。FIND-MAX-CROSSING-SUBARRAY 和 FIND-MAXIMUM-SUBARRAY 函数的伪代码详细展示了这一过程。

问题:求数组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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值