用三种方法实现最大子列和的求解(Python实现)

问题描述:给定N个整数的序列{ A1, A2, …, AN}, 求该序列的最大子列和。
操作系统:Windows 10  编译环境:Pycharm  编程语言:Python3.6
实现思路:首先得有数据,所以先用代码实现随机列表的生成,随后用三种算法实现,并在主函数中实现函数的调用以及结果的输出
import random

#生成随机列表 start和stop分别代表所需要列表元素的大小范围,length代表列表的长度
def random_int_list(start, stop, length):
    start, stop = (int(start), int(stop)) if start <= stop else (int(stop), int(start))
    length = int(abs(length)) if length else 0
    random_list = []
    for i in range(length):
        random_list.append(random.randint(start, stop))
    return random_list

def main():
    N = 10
    A = random_int_list(-20, 20, N)
    maxsum = MAXSUBSEQSUM1(A, N)
    maxsum2= MAXSUBSEQSUM2(A, N)
    maxsum3= MAXSUBSEQSUM3(A, N)
    #分别用三种算法实现并输出结果
    print(maxsum)
    print(maxsum2)
    print(maxsum3)

#用最基础的方法来实现最大子列和,算法复杂度O(N*N*N)
def MAXSUBSEQSUM1(A, N):
    ThisSum, MaxSum = 0, 0
    for i in range(N): #i代表子列的左端位置
        for j in range(i, N):#j代表子列的左端位置
            ThisSum = 0   #ThisSum是从A[I]到A[J]的子列和
            for k in range(i, j+1):
                ThisSum += A[k]
                if ThisSum > MaxSum: #如果刚得到的这个子列和更大
                    MaxSum = ThisSum  #则更新结果
    return MaxSum
#在上面那个算法做了一些修改使算法复杂度降低,算法复杂度O(N*N)
def MAXSUBSEQSUM2(A, N):
    ThisSum, MaxSum = 0, 0
    for i in range(N):
        ThisSum = 0
        for j in range(i, N):
            ThisSum += A[j] #只在前一个和上增加一个元素得到新的和
            if ThisSum > MaxSum:
                MaxSum = ThisSum
    return MaxSum

#在线处理算法
def MAXSUBSEQSUM3(A, N):
    ThisSum, MaxSum = 0, 0
    for i in range(N):
        ThisSum += A[i]  #向右累加
        if ThisSum > MaxSum:
             MaxSum = ThisSum  #发现更大和则更新当前结果
        elif ThisSum<0:   #如果当前子列和为负数
            ThisSum=0     #则不可能使后面的部分和增大,则该抛弃掉
    return MaxSum

main()

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值