如何使用分而治之方法解决FindMaximumSubarray的重复发生错误?

这是我对findMaximumSubarray的解决方案,我遵循CLRS伪代码算法,但遇到此递归错误,我试图找出原因,但是却无济于事!

我无法理解递归的这一部分,第一行是找到左除数组,直到到达一个元素的基本情况为止,然后我的大脑在发抖,我无法想象在那之后会发生什么!

 leftLow,leftHigh,leftSum = FindMaxSubarray(array,low,mid)
 rightLow,rightHigh,rightSum = FindMaxSubarray(array,mid,high)
 crossLow,crossHigh,crossSum = MaxCrossSubarray(array,high)

这是整个代码。

array = [0,1,-2,3,4,5,-1,10,11,9,-5,-10,12]
low = 0 
high = len(array)

mid  = len(array)//2


def MaxCrossSubarray(array,high):
    sum = 0
    left_sum = float('-inf')
    for i in range(mid,-1):
        sum = sum+array[i]
        if sum > left_sum:
            left_sum = sum 
            max_left = i
    right_sum = float('-inf')
    sum = 0
    for i in range(mid+1,high):
        sum = sum+array[i]
        if sum > right_sum:
            right_sum = sum 
            max_right = i
    return (max_left,max_right,left_sum+right_sum)

def FindMaxSubarray(array,high):
    if high == low :
        return (low,high,array[low])
    else:
        mid = (high+low)//2 
        leftLow,mid)
        rightLow,high)
        crossLow,high)
        if leftSum >= rightSum and leftSum >=crossSum:
            return (leftLow,leftSum)
        elif rightSum >= leftSum and rightSum >=crossSum:
            return (rightLow,rightSum)
        else:
            return (crossLow,crossSum)

low,sum = FindMaxSubarray (array,high)        

z492572861 回答:如何使用分而治之方法解决FindMaximumSubarray的重复发生错误?

 leftLow,leftHigh,leftSum = FindMaxSubarray(array,low,mid)
 rightLow,rightHigh,rightSum = FindMaxSubarray(array,mid,high)
 crossLow,crossHigh,crossSum = MaxCrossSubarray(array,high)

上面的代码中的想法是,您在数组的右,左和叉和处找到了子数组的最大值。正如您在问题the first line is to find divide left array until reaching the base case which is one element中所解释的。这是正确的,其他部分也适用相同的逻辑。

递归问题源于此行

rightLow,high)

mid=0high = 1处,这将导致递归错误,因为在这些值下,以下内容始终为假。

if high == low :
    return (low,high,array[low])

要解决递归问题,只需更改为此

rightLow,mid+1,high)

这确保了可以满足返回条件,从而防止了递归错误。

已更改,看来您的MaxCrossSubArray在逻辑上不正确,并且在运行它时出现以下错误

UnboundLocalError:分配前已引用局部变量'max_right'

调查一下,看看是否可以解决。

N.B:已知CLRS包含一些错误,并且相对较旧。因此,我建议您不要坚持使用相同的解决方案,而要寻找其他可能性。例如,请参见this

本文链接:https://www.f2er.com/2449494.html

大家都在问