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

来源:互联网 发布:对网络的认识和感受 编辑:程序博客网 时间:2024/05/18 03:41
问题描述:给定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_listdef 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 MaxSummain()

阅读全文
1 0
原创粉丝点击