python演算法之分治演算法

2021-10-02 08:06:12 字數 2224 閱讀 3736

當我們求解某些問題時,由於這些問題要處理的資料相當多,或求解過程相當複雜,使得直接求解法在時間上相當長,或者根本無法直接求出。對於這類問題,我們往往先把它分解成幾個子問題,找到求出這幾個子問題的解法後,再找到合適的方法,把它們組合成求整個問題的解法。如果這些子問題還較大,難以解決,可以再把它們分成幾個更小的子問題,以此類推,直至可以直接求出解為止。這就是分治策略的基本思想。

我的理解就是「分而治之」,將乙個大問題分解成若干個子問題,一般情況下分為2個,然後將分解後的且已經解決的各塊合併,求解

求順序表的最大值

import time

defget_max

(list)

: a=

max(list)

return a

defget_fz

(list)

: n=

len(list)

if n<=2:

#若問題模組小於或等於2

return get_max(list)

#分解子問題模組

left_list,right_list=list[

:n//2]

,list[n//2:

]#遞迴,分治

left_max,right_max=get_fz(left_list)

,get_fz(right_list)

return get_max(

[left_max,right_max]

)if __name__ ==

'__main__'

: num=

[i for i in

range

(1000)]

s_1=time.time(

)print

(get_fz(num)

)

判斷某個元素是否在列表中

def

is_in_list

(list,n)

:return

[false

,true

][list[0]

==n]

#判斷為真返回true,為假返回false

defsolve

(list,n)

: n=

len(list)

if n==1:

return is_in_list(list,n)

#分解,子問題規模沒n/2

left_list,right_list=list[

:n//2]

,list[n//2:

]#遞迴,分治,合併

res=solve(left_list,n)

or solve(right_list,n)

return res

if __name__ ==

'__main__'

: list1=

[i for i in

range(10

)]print

(solve(list1,22)

)print

(solve(list1,3)

)

找出一組序列中最小的值

def

partition

(seq)

: pi=seq[0]

lo=[x for x in seq[1:

]if x<=pi]

hi=[x for x in seq[1:

]if x>pi]

return lo,pi,hi

defselect

(seq,k)

:#分解

lo,pi,hi=partition(seq)

m=len(lo)

if m==k:

return pi

elif mreturn select(hi,k-m-1)

#遞迴,分治

else

:return select(lo,k)

#遞迴分治

if __name__ ==

'__main__'

: list2=

[i for i in

range(20

)]#查詢print

(select(list2,4)

)print

(select(list2,6)

)#從0開始

演算法篇之分治演算法 歸併排序

分治演算法 分治 把乙個任務分成形式和原任務相同,但規模更小的幾個部分任務 通常是兩個部分 分別完成,或只需要選一部分完成。然後再處理完成後的這乙個或幾個部分的結果,實現整個任務的完成。例題1 歸併排序 陣列排序任務可以如下完成 a.把前一半排序 b.把後一半排序 c.把兩半歸併到乙個新的有序陣列,...

演算法思想之分治遞迴策略

摘自 鄒恒明 演算法之道 採取分治策略解決問題有三個步驟 1 將問題分解為若干個小的子問題。每個子問題和大問題同型,但規模更小。2 遞迴解決這些問題。3 將子問題的解答合併,並獲得大問題的解答。第二步中 遞迴解決這些子問題 指的是按照同樣的分治策略進行求解,即通過將這些子問題分解到更小的孫子問題來進...

基礎演算法排序之分治排序

寫在之前的話 對於博文的內容出現的本人觀點 博文中的內容有的摘自於演算法導論 的不當或者錯誤而對你造成困擾的話,你可以盡情的鄙視與吐槽,最好寫出你的觀點,本人定當虛心受教。分而治之,顧名思義也就是將原問題的規模分解成一系列規模小的子問題,演算法導論中是這麼說的 分治模式在每一層遞迴上都有三個步驟 分...