演算法導論 分治演算法求最大子陣列

2021-09-12 13:07:52 字數 1394 閱讀 4728

問題描述:求乙個陣列中的連續子陣列,該連續子陣列的和的值最大。

解決方法:

具體求解思路:使用遞迴。

先將原陣列劃分為兩個陣列,不斷分治劃分,到最小(即low==high)。求此時的乙個小陣列的最大左子陣列與最大右子陣列以及cross_mid. 取最大值做為該小陣列的最大子陣列,不斷遞迴。

**如下:在這裡插入**片

import sys

sys.setrecursionlimit(1000000)

def max_son_array(a,low,high,mid):

left_sum=0

right_sum=0

left_max=0

right_max=0

left=mid

right=mid

for i in range(mid-1,low,-1):

left_sum+=a[i]

if left_sum>left_max :

left_max=left_sum

left=i

for i in range (mid,high):

right_sum+=a[i]

if right_sum>right_max :

right_max=right_sum

right=i

max_sum=left_max+right_max

return (max_sum , left, right)

def find_max_array(a,low,high):

if low==high:

return (low,high,a[low])

else:

mid =(low+high)//2

(l_low,l_high,l_sum)=find_max_array(a,low,mid)

(r_low,r_high,r_sum)=find_max_array(a,mid+1,high)

(c_sum,c_low,c_high)=max_son_array(a,low,high,mid)

if (l_sum>=r_sum)&(l_sum>=c_sum):

return (l_low,l_high,l_sum)

elif (c_sum>=l_sum)&(c_sum>=r_sum):

return (c_low,c_high,c_sum)

else :

return (r_low,r_high,r_sum)

aa=[13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]

print(find_max_array(aa,0,len(aa)-1))

演算法導論 分治法 最大子陣列

題目描述 給定義陣列a,長度為n,找出陣列a中的最大子陣列,例如陣列a 則最大子陣列為。使用分治策略的求解方法 假定我們要尋找子陣列a low.high 的最大子陣列,使用分治法意味著我們要將子陣列劃分為兩個規模盡可能相等的子陣列。也就是說,找到子陣列的 位置,比如mid,然後求解兩個子陣列a lo...

演算法導論 最大子陣列

之前都在準備考試,寒假還是繼續學習。除了家裡打掃衛生,似乎也確實沒什麼事。多看書,多寫 總能提高的。堅持。這次學到了函式返回值可以是乙個結構體,當我們要返回多個值的時候,就可以返回結構體。還有就是對分治法有了更深的認識。include typedef struct op op findmaxcros...

分治演算法 最大子陣列

該演算法核心思想 任何連續最大子陣列必然處於以下三種情況 子陣列完全落在中點左邊 子陣列完全落在中點右邊 子陣列橫跨中點 所以先求出左邊最大的子陣列,再找出右邊的,然後從中間找。比較大小即可。中間點的最大子陣列容易確定,左右兩邊的無法確定,所以需要遞迴,把左右兩邊的陣列分解到只剩乙個元素時就能輕鬆確...