求解最大子数组

假定要寻找子数组A[low, high] 的最大子数组。

使用分治法:将子数组划分为两个规模尽量相等的子数组。也就是说,找到子数组的中央位置--mid,然后考虑求解子数组A[low...mid], A[mid+1, high]。A的任何子数组所处的位置必然是以下三种情况之一:

  •     完全位于子数组A[low...mid]中,因此 low<= i <= j <= mid

  •     完全位于子数组A[mid+1...high]中, 因此mid < i <= j <= high

  •     跨越了中点,因此 low <= i <= j <=high

因此,最大子数组必然是完全位于A[low...mid]中、完全位于A[mid+1...high]中、或者跨越中点的所有子数组中的最大者。我们可以递归求解A[low...mid], A[mid+1, high]的最大子数组,因为这两个问题仍是最大子数组问题,只是规模更小。剩下的全部工作就是寻找cross-mid的最大子数组,然后在三种情况中选取和最大者

    

def find-max-crossing-subarray(A, low, mid, high):
    left-sum = -sys.maxint
    sum = 0 
    for i in range(mid, low):
        sum = sum + A[i]
        if sum > left-sum
            left-sum = sum
            max-left = i
    right-sum = -sys.maxint
    sum = 0
    for j in range(mid + 1, high):
        sum = sum + A[j]
        if sum > right-sum:
            right-sum = sum
            max-right = j
    return (max-left, max-right, left-sum + right-sum)  
        
        
        
def 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)
        rignt-low, right-high, right-sum = find-maximum-subarray(A, mid+1, high)
        cross-low, cross-high, cross-sum = find-maximum-crossing-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)



转载于:https://my.oschina.net/aries322/blog/186822

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值