1. 程式人生 > >python求解最大子序列和(連續不連續)

python求解最大子序列和(連續不連續)

首先分治演算法求解不連續的最大子序列

分治演算法步驟:

1.將問題分解為若干簡單的子問題

2.通過遞迴尋求各個子問題的解

3.合併各個子問題的解,從而得到原始問題的解

首先對於求解連續最大子序列問題而言,將序列劃分為左、右兩部分,連續最大序列和的分佈有三種情況。

第一種:存在於左邊序列

第二種:存在右邊序列

第三種:跨界的序列

首先先定義比較三個數大小的函式,其次再寫尋找最大子序列和的函式,在函式中求解左右兩邊最大子序列和時必然會遞迴呼叫此函式,注意遞迴的結束條件。

def max3(x,y,z):#求三個數的最大值
max=x
    if y>max:
        max=y
    if z>max:
        max=z
        return 
max else: return max def findmaxsum(alist):#求最大子序列和 length=len(alist) if len(alist)<=1:#遞迴結束條件 return alist[0] mid=length//2 left_list=alist[:mid] rigth_list=alist[mid:] leftmaxsum=findmaxsum(left_list)#遞迴解決左邊序列最大子序列和 rightmaxsum=findmaxsum(rigth_list)#遞迴解決右邊最大子序列和 max_left_right_sum=leftmaxsum+rightmaxsum#跨界情況,進行求和 return
max3(leftmaxsum,rightmaxsum,max_left_right_sum)#返回最大值

時間複雜度為O(nlogn),比暴力尋找的時間複雜度O(n^2)有所優化

動態規劃求連續的最大子序列和

def test_func(num_list):#動態規劃求最大連續子序列
length=len(num_list)
    max_value=-10000000tmp=0
for i in range(length):
        tmp=max(tmp+num_list[i], num_list[i])#有效解決了連續問題
        max_value=max(max_value, tmp)
    
return max_value

時間複雜度為O(n),動態規劃引用自點選開啟連結