标签:right start 最大值 分治 mid merge 数组 公共 left
最大公共子数组问题(分治法)
原理:
采用二分法,分别找出左边数组的最大值,右边数组的最大值,再找出带有中间元素的最大值
S1:数组X[1,n/2]中的最大值
S2:数组X[n/2+1, n]的最大值
S3:包含中间元素的最大值
算法实例:
分解:
归并:
代码:
'''
最大子数组问题(分治法)
这里主要分为三个部分
1.求二分之后左边和右边的最大值
2.求合并之后的最大值
3.上面三者比较取最大值
'''
def max_sub(X, start, end):
# 如果只有一个数字的话那么最大子数组就是它本身
if start == end:
return X[start]
# 记录一下中间位置
mid = int((start + end)/2)
# 获取左边最大子数组
left = max_sub(X, start, mid)
# 获取右边最大子数组
right = max_sub(X, mid+1, end)
# 获取合并之后的最大子数组
merge = get_merge(X, start, mid, end)
# 判断一下左边右边中间那个数值最大就返回那个数值
if left > right:
if right > merge:
return left
elif left > merge:
return left
else:
return merge
else:
if left > merge:
return right
elif right > merge:
return right
else:
return merge
def get_merge(X, start, mid, end):
# 左边包含中间的最大值
max_left = X[mid]
# 左边辅助计算的最大值
temp_max_left = X[mid]
# 右边最大值
max_right = X[mid+1]
# 右边辅助计算的最大值
temp_max_right = X[mid+1]
# 计算左边的最大值
for i in range(mid-1, start-1, -1):
if max_left <= temp_max_left + X[i]:
max_left = temp_max_left + X[i]
temp_max_left += X[i]
# 计算右边的最大值
for i in range(mid+2, end+1):
if max_right <= temp_max_right + X[i]:
max_right = temp_max_right + X[i]
temp_max_right += X[i]
return max_right + max_left
# 测试数据
X = [-1,-3,3,5,-4,3,2,-2,3,6]
length = len(X)-1
max_num = max_sub(X, 0, length)
print(max_num)
标签:right,start,最大值,分治,mid,merge,数组,公共,left 来源: https://www.cnblogs.com/zjhnuil/p/16219096.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。