python求解最大子序列和(連續不連續)
阿新 • • 發佈:2019-02-19
首先分治演算法求解不連續的最大子序列
分治演算法步驟:
1.將問題分解為若干簡單的子問題
2.通過遞迴尋求各個子問題的解
3.合併各個子問題的解,從而得到原始問題的解
首先對於求解連續最大子序列問題而言,將序列劃分為左、右兩部分,連續最大序列和的分佈有三種情況。
第一種:存在於左邊序列
第二種:存在右邊序列
第三種:跨界的序列
首先先定義比較三個數大小的函式,其次再寫尋找最大子序列和的函式,在函式中求解左右兩邊最大子序列和時必然會遞迴呼叫此函式,注意遞迴的結束條件。
def max3(x,y,z):#求三個數的最大值 max=x if y>max: max=y if z>max: max=z returnmax 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#跨界情況,進行求和 returnmax3(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),動態規劃引用自點選開啟連結