ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

最大公共子数组问题(分治法)

2022-05-03 19:33:34  阅读:167  来源: 互联网

标签:right start 最大值 分治 mid merge 数组 公共 left


最大公共子数组问题(分治法)

原理:

采用二分法,分别找出左边数组的最大值,右边数组的最大值,再找出带有中间元素的最大值

image-20220503182312517

S1:数组X[1,n/2]中的最大值

S2:数组X[n/2+1, n]的最大值

S3:包含中间元素的最大值

image-20220503191705210

算法实例:

分解:

image-20220503182816198

归并:

image-20220503191605979

代码:

'''
最大子数组问题(分治法)
    这里主要分为三个部分
    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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有