當我們求解某些問題時,由於這些問題要處理的資料相當多,或求解過程相當複雜,使得直接求解法在時間上相當長,或者根本無法直接求出。對於這類問題,我們往往先把它分解成幾個子問題,找到求出這幾個子問題的解法後,再找到合適的方法,把它們組合成求整個問題的解法。如果這些子問題還較大,難以解決,可以再把它們分成幾個更小的子問題,以此類推,直至可以直接求出解為止。這就是分治策略的基本思想。
我的理解就是「分而治之」,將乙個大問題分解成若干個子問題,一般情況下分為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 將子問題的解答合併,並獲得大問題的解答。第二步中 遞迴解決這些子問題 指的是按照同樣的分治策略進行求解,即通過將這些子問題分解到更小的孫子問題來進...
基礎演算法排序之分治排序
寫在之前的話 對於博文的內容出現的本人觀點 博文中的內容有的摘自於演算法導論 的不當或者錯誤而對你造成困擾的話,你可以盡情的鄙視與吐槽,最好寫出你的觀點,本人定當虛心受教。分而治之,顧名思義也就是將原問題的規模分解成一系列規模小的子問題,演算法導論中是這麼說的 分治模式在每一層遞迴上都有三個步驟 分...