您的位置:首页 > 其它

[算法] 求环形数组中和值最大子段

2013-10-30 14:16 302 查看
对于非环形数组,求解和值最大子段的方法见之前一遍文章

对于环形数组,需要考虑最大和值子段越过首尾边界的情况,解决方法比较简单,即将数组处理两遍; 需要注意子段长度不可以超过整个数组长度;

#! -*- coding: utf-8 -*-

loop = (4, -3, 2, -4, 1, 5, -3, -4, 3)
#loop = (4, 3, 2, 4, 1, 5, 3, 4, 3)
#loop = (-4, -3, -2, -4, -1, -5, -3, -4, -3)

# 求解和值最大子段
# 算法关键是将和值对整体不利的子序列舍弃,修减问题树
# 复杂度O(n)
# 为处理循环数组,遍历数组两遍,注意子段长度是否达到了数组长度
def big_sub():
try_sum = 0
try_start = 0
length = 0 #
try_length = 0 #

start = 0
end = 0
sum = 0
big = loop[0]
big_index = 0

for index in range(0, 2*len(loop)): #
i = index % len(loop) #

if try_sum >= 0:
try_sum += loop[i]
try_length += 1 #
if (try_sum > sum):
sum = try_sum
length = try_length #
if length >= len(loop): #
break #
end = i
start = try_start
else: # try_sum < 0
try_sum = loop[i]
try_start = i
try_length = 1 #

if loop[i] > big:
big = loop[i]
big_index = i

if sum == 0:
sum = big
start = end = big_index

if start <= end and length < len(loop): #
print loop[start:end+1],
elif length >= len(loop):
print loop,
else: #
print loop[start:],
print loop[:end+1],
print sum

big_sub()


注:红字部分是为处理环形数组而修改的代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: