最大和子数组python

时间:2019-07-10 16:25:00

标签: python-3.x algorithm max divide-and-conquer sub-array

我正在关注“算法简介”这本书,并使用给出的算法来制作程序,但是程序无法按预期工作。

以前功能的总和可能正添加到新总和中,因此我不知道如何打印它。 当我放置单个元素列表时,输出是预期的,但是当我放置2个或更多元素列表时,说[2,3]则得到输出4,这是不期望的

def max_crossing_subarray(array,low,mid,high):
    left_sum = -1000
    sum_ar = 0

    for i in range(mid, low-1, -1):
        sum_ar = sum_ar + array[i]
        if sum_ar>left_sum:
            left_sum = sum_ar
            max_left = i

    right_sum = -1000
    sum_ar = 0

    for i in range(mid,high):
        sum_ar = sum_ar + array[i]
        if sum_ar>right_sum:
            right_sum = sum_ar
            max_right = i

    return [max_left, max_right, left_sum + right_sum]

def max_subarray(array, low, high):
    if low==high:
        return [low, high, array[low]]
    else:
        mid = int((low + high)/2)
        left_low, left_high, left_sum = max_subarray(array, low, mid)
        right_low, right_high, right_sum = max_subarray(array,mid+1,high)
        cross_low, cross_high, cross_sum = max_crossing_subarray(array, 
low, mid, high)

        if left_sum>=right_sum and left_sum>=cross_sum:
            return [left_low, left_high, left_sum]
        elif right_sum>=left_sum and right_sum>=cross_sum:
            return [right_low, right_high, right_sum]
        else:
            return [cross_low, cross_high, cross_sum]

arr = [2,3]
ar= max_subarray(arr, 0, len(arr)-1)
print(ar)

当我输入列表[2]时,我得到了输出[0,0,2]#[low,high,sum] 但是对于[2,3]和[2,5],我分别得到的输出分别为[0,0,4]和[1,1,5]。

1 个答案:

答案 0 :(得分:2)

在计算最大交叉子数组时,语句范围的秒数应从中点+ 1开始,并在高点+ 1结束。一个。