递归,分而治之最大子数组
Recursive, Divide and Conquer Max Subarray
我似乎无法弄清楚为什么我在编译时收到一条针对下面突出显示的行的错误消息。错误消息是 "ValueError: need more than 2 values to unpack"... 在此先感谢您的帮助
def divConHelper(array, first, center, last):
sumRight = float('-inf') #assign impossibly low number
sumLeft = float('-inf') #assign impossibly low number
leftIndexMax = 0
rightIndexMax = 0
# Determine crossover max toward left
currentLTotal = 0
for i in range(first, center):
#Incrementally add values to sum
currentLTotal += sum(array[i:center-1])
#if the total is greater than the sumLeft, replace
if currentLTotal > sumLeft:
sumLeft = currentLTotal
leftIndexMax = i
# Determine crossover max toward right
currentRTotal=0
for i in range(center+1, last):
#Incrementally add values to sum
currentRTotal += sum(array[center:i+1])
#if the rightTotal is greater than the sumRight, replace
if currentRTotal > sumRight:
sumRight = currentRTotal
rightIndexMax = i+1
bothTotal = sumRight + sumLeft
return(leftIndexMax, rightIndexMax, bothTotal)
#return(bothTotal)
def divConMaxSub(self, array, first, last):
if (last-first) == 0:
return array[first: last +1], array[0]
center = (first+last)// 2
#Recursive calls to divConMaxSub
(minA, maxA, sumA) = self.divConMaxSub(array, first, center)
(minB, maxB, sumB) = self.divConMaxSub(array, center+1, last)
#call to get max cross values
(maxL, maxR, maxCross) = divConHelper(array, first, center, last)
#Calulate the max subarray value
finalMax = max(sumA, sumB, maxCross)
#Logic block for return values
if (finalMax == sumA):
return array[minA: maxA], sumA
#return minA, maxA, sumA
elif (finalMax == sumB):
return array[minB: maxB], sumB
#return minB, maxB, sumB
elif (finalMax == maxCross):
return array[maxL: maxR], maxCross
#return maxL, maxR, maxCross
这是我的主要代码
from array import *
from utilities import utilities
from algorithms import algorithms
def main():
utils = utilities()
alg = algorithms()
results = utils.load()
for line in results:
max_sub_array, max_sum = alg.simpleenumeration(line)
utils.printtofile("Simple Enumeration", max_sub_array, max_sum)
max_sub_array, max_sum = alg.betterenumeration(line)
utils.printtofile("Better Enumeration", max_sub_array, max_sum)
max_sub_array, max_sum = alg.divConMaxSub(line)
utils.printtofile("Divide and Conquer", max_sub_array, max_sum)
max_sub_array, max_sum = alg.linear_sub_array(line)
utils.printtofile("Linear sub array", max_sub_array, max_sum)
# print("--------------------")
main()
这条语句:
return array[minA: maxA], sumA
不 return 三个参数(正如您在此代码中所期望的那样):
(minA, maxA, sumA) = self.divConMaxSub(array, first, center)
它 return 将数组的一部分作为第一个参数,将总和作为第二个参数。因此,Python报错不能用divConMaxSub的输出来初始化左边的三个值,因为右边只有两个值。
我似乎无法弄清楚为什么我在编译时收到一条针对下面突出显示的行的错误消息。错误消息是 "ValueError: need more than 2 values to unpack"... 在此先感谢您的帮助
def divConHelper(array, first, center, last):
sumRight = float('-inf') #assign impossibly low number
sumLeft = float('-inf') #assign impossibly low number
leftIndexMax = 0
rightIndexMax = 0
# Determine crossover max toward left
currentLTotal = 0
for i in range(first, center):
#Incrementally add values to sum
currentLTotal += sum(array[i:center-1])
#if the total is greater than the sumLeft, replace
if currentLTotal > sumLeft:
sumLeft = currentLTotal
leftIndexMax = i
# Determine crossover max toward right
currentRTotal=0
for i in range(center+1, last):
#Incrementally add values to sum
currentRTotal += sum(array[center:i+1])
#if the rightTotal is greater than the sumRight, replace
if currentRTotal > sumRight:
sumRight = currentRTotal
rightIndexMax = i+1
bothTotal = sumRight + sumLeft
return(leftIndexMax, rightIndexMax, bothTotal)
#return(bothTotal)
def divConMaxSub(self, array, first, last):
if (last-first) == 0:
return array[first: last +1], array[0]
center = (first+last)// 2
#Recursive calls to divConMaxSub
(minA, maxA, sumA) = self.divConMaxSub(array, first, center)
(minB, maxB, sumB) = self.divConMaxSub(array, center+1, last)
#call to get max cross values
(maxL, maxR, maxCross) = divConHelper(array, first, center, last)
#Calulate the max subarray value
finalMax = max(sumA, sumB, maxCross)
#Logic block for return values
if (finalMax == sumA):
return array[minA: maxA], sumA
#return minA, maxA, sumA
elif (finalMax == sumB):
return array[minB: maxB], sumB
#return minB, maxB, sumB
elif (finalMax == maxCross):
return array[maxL: maxR], maxCross
#return maxL, maxR, maxCross
这是我的主要代码
from array import *
from utilities import utilities
from algorithms import algorithms
def main():
utils = utilities()
alg = algorithms()
results = utils.load()
for line in results:
max_sub_array, max_sum = alg.simpleenumeration(line)
utils.printtofile("Simple Enumeration", max_sub_array, max_sum)
max_sub_array, max_sum = alg.betterenumeration(line)
utils.printtofile("Better Enumeration", max_sub_array, max_sum)
max_sub_array, max_sum = alg.divConMaxSub(line)
utils.printtofile("Divide and Conquer", max_sub_array, max_sum)
max_sub_array, max_sum = alg.linear_sub_array(line)
utils.printtofile("Linear sub array", max_sub_array, max_sum)
# print("--------------------")
main()
这条语句:
return array[minA: maxA], sumA
不 return 三个参数(正如您在此代码中所期望的那样):
(minA, maxA, sumA) = self.divConMaxSub(array, first, center)
它 return 将数组的一部分作为第一个参数,将总和作为第二个参数。因此,Python报错不能用divConMaxSub的输出来初始化左边的三个值,因为右边只有两个值。