最大子串行求解

2021-09-04 11:31:04 字數 2586 閱讀 8329

什麼是最大子串行?

資料存在乙個list中,和最大的子list就是最大子串行

定義:data[1,-2,5,4,-4],寒無疑問,最大子串行就是[5,4] ,sum=9

求解方法:

一、列舉,這是暴力演算法,簡單的講就是列舉全部子串行,通過比較,然後求出最大的子串行,演算法複雜為o(n^3)

def max_son(data):

n = len(data)

max_son = 0

for left in range(0,n-1):

for right in range(left,n-1):

this_son = 0

for key in range(left,right):

this_son += data[key]

if max_son < this_son:

max_son = this_son

return max_son

二、列舉改進。從第乙個演算法可知,第一層迴圈,迴圈的是子串行的左邊界:第二層迴圈,迴圈的是子串行的右邊界:第三層迴圈,迴圈的是當前子串行的每個元素。每次迴圈完當前子串行後,當前子串行和清零,這就造成計算浪費,因為,下乙個子串行,不過是當前子串行的右邊界向後一位,也就是增加乙個元素,so,可以刪除第三次迴圈,保留當前子串行的和。演算法複雜度為o(n^2)

def max_son(data):

n = len(data)

max_son = 0

for left in range(0,n-1):

this_son = 0

for right in range(left,n-1):

this_son += data[right]

if max_son < this_son:

max_son = this_son

return max_son

三、分治。分就是將原問題的規模每次縮小,治就是對當原問題縮小到一定規模的時候,直接求解,再合併子規模的解,就是原問題的解。通常,將分治和遞迴聯絡在一起,遞迴有利於問題的縮小與子答案的合併。對於用分治求解最大子串行,對於規模的雖小,顯然是縮減list的長度,縮減到什麼規模合適呢?縮減到乙個元素就是最合適的,縮小的思想和中學用隔板法求解排列組合問題相似。至於求解,特別注意解的合併,需要計算包含兩個子串行的邊界的和,這樣才能最終合併為原序列的解。至於遞迴,需包含兩大要素,可變遞迴因子和出口,這就契合的分治的思想,可變遞迴因子對應縮小規模,出口就是最小問題的解,也就是僅僅只有乙個元素的時候的子串行。演算法複雜度為o(nlogn)

def max_son(left,right,data):

if left == right:

if data[left] > 0:

return data[left]

else:

return 0

center = (left + right)//2

max_son_l=max_son(left,center,data)

max_son_r=max_son(center+1,right,data)

max_son_of_left = son_of_left = 0

for x in range(center-1,left-1,-1):

son_of_left += data[x]

if max_son_of_left < son_of_left:

max_son_of_left = son_of_left

max_son_of_right = son_of_right = 0

for i in range(center,right+1):

son_of_right += data[i]

if max_son_of_right < son_of_right:

max_son_of_right = son_of_right

return max(max_son_l,max_son_r,max_son_of_left+max_son_of_right)

四、實時比較。我也不知道為這個演算法取什麼名字,就隨便diy了乙個。這個演算法可以完爆前面的演算法,當然是就本題而言。前面的演算法實際上都是為了比較各個子串行的和,然後求出最大值。注意要求,是求出最大子串行的和,根據第三個分治演算法,每個序列都是由它的子串行構成,我們叫它為母序列,那麼當乙個母序列的子串行變成負數的時候,這個序列肯定就沒必要再加到其母序列中了。so,我們從原序列的左邊開始疊加,每加乙個元素就是更新乙個母序列,當當前母序列為負數時,下乙個母序列就沒必要再加這個序列了,再從當前元素重新疊加母序列。演算法複雜度為o(n)

def max_son(data):

n = len(data)

max_son = this_son = 0

for left in range(0,n-1):

this_son += data[left]

if max_son < this_son:

max_son = this_son

elif this_son < 0:

this_son = 0

return max_son

最大子串行和問題求解

基本思想 窮舉式的嘗試所有可能,通過三層迴圈計算所有子串行的和。演算法步驟 1.第一層迴圈從0到n 1,確定子串行的開始位置 2.第二層迴圈從第一層迴圈變數開始到n 1,確定子串行的結束位置 3.第三層迴圈從第一層迴圈變數開始到第二層迴圈變數結束,計算這個子串行的和,並與最大子串行和比較,如果大於最...

求解最大子串行和問題

原題 給定乙個陣列,其中元素有正,也有負,找出其中乙個連續子串行,使和最大 不想說明什麼,我們資料結構老師第一節課就給我們講這個,以前給實現過乙個暴力演算法版的演算法複雜度 o n2 現在實現乙個動態規劃版的 求解最大子串行和問題o n 演算法 param array public static v...

最大子串行乘積 DP求解

問題起源於 資料結構與演算法分析 c語言描述 一書中的習題2.12。存在序列a a1,a2,an 在此僅討論序列a中元素均為整數的情況 問 給出有效的演算法求解最大子串行乘積。一看此題,容易想到的是窮舉所有的可能的子串行,求乘積後去最大值,如下。1 int maxproduct int a,int ...