Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用分治方法解决FindMaximum子阵列的重复误差?_Python_Algorithm_Divide And Conquer_Clrs - Fatal编程技术网

Python 如何使用分治方法解决FindMaximum子阵列的重复误差?

Python 如何使用分治方法解决FindMaximum子阵列的重复误差?,python,algorithm,divide-and-conquer,clrs,Python,Algorithm,Divide And Conquer,Clrs,这是我对findMaximumSubarray的解决方案,我遵循CLRS伪代码算法,我得到了这个递归错误,我试图找出原因,但我一无所获 我无法理解递归的这一部分,第一行是找到左除数组,直到到达一个元素的基本情况,然后我的大脑开始崩溃,我无法想象接下来会发生什么 leftLow, leftHigh, leftSum = FindMaxSubarray(array, low, mid) rightLow, rightHigh, rightSum = FindMaxSubarray(array,

这是我对findMaximumSubarray的解决方案,我遵循CLRS伪代码算法,我得到了这个递归错误,我试图找出原因,但我一无所获

我无法理解递归的这一部分,第一行是找到左除数组,直到到达一个元素的基本情况,然后我的大脑开始崩溃,我无法想象接下来会发生什么

 leftLow, leftHigh, leftSum = FindMaxSubarray(array, low, mid)
 rightLow, rightHigh, rightSum = FindMaxSubarray(array, mid, high)
 crossLow, crossHigh, crossSum = MaxCrossSubarray(array, low, mid, high)
这就是全部代码

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

mid  = len(array)//2


def MaxCrossSubarray(array, low, mid, high):
    sum = 0
    left_sum = float('-inf')
    for i in range(mid, low, -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, low, high):
    if high == low :
        return (low, high, array[low])
    else:
        mid = (high+low)//2 
        leftLow, leftHigh, leftSum = FindMaxSubarray(array, low, mid)
        rightLow, rightHigh, rightSum = FindMaxSubarray(array, mid, high)
        crossLow, crossHigh, crossSum = MaxCrossSubarray(array, low, mid, high)
        if leftSum >= rightSum and leftSum >=crossSum:
            return (leftLow, leftHigh, leftSum)
        elif rightSum >= leftSum and rightSum >=crossSum:
            return (rightLow, rightHigh, rightSum)
        else:
            return (crossLow, crossHigh, crossSum)

low, high, sum = FindMaxSubarray (array, low, high)        

上面代码中的思想是,您正在查找数组右侧、左侧和交叉和的子数组的最大值。正如您在问题
中所解释的,第一行是查找divide left数组,直到到达一个元素的基本大小写。这是正确的,同样的逻辑适用于其他部件

递归问题源于这一行

rightLow, rightHigh, rightSum = FindMaxSubarray(array, mid, high)
其中
mid=0
high=1
,这会导致递归错误,因为在这些值下,以下值始终为假

if high == low :
    return (low, high, array[low])
要解决递归问题,只需更改为

rightLow, rightHigh, rightSum = FindMaxSubarray(array, mid+1, high)
这可以确保满足返回条件,从而防止递归错误

更改后,您的
MaxCrossSubArray
似乎在逻辑上不正确,运行时会出现以下错误

UnboundLocalError:赋值前引用的局部变量“max_right”

调查一下,看看你是否能解决它


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

请务必查看我的答案,并让我知道它是否有助于
范围内的i(中,低-1,-1):
low-1是我的错误,因为
range
达到1而不是0,并停止我的低值为0。
rightLow, rightHigh, rightSum = FindMaxSubarray(array, mid+1, high)