分治(divide and conquer)是一種演算法正規化,也是一種解決問題的思想。
步驟如下:
1.分解(divide):將問題分解為同一型別的子問題;
2.治理(conquer):遞迴地解決子問題;
3.合併(combine):合併子問題的答案,得出原問題的答案。
任何乙個可以用計算機求解的問題,所需的計算時間都與其規模有關。
問題的規模越小,越容易直接求解,所需的計算時間也越少。
例如,對於n各元素排序問題,當n=1時,不需要計算;n=2時,只需做一次比較;當n=3時,只需做3次比較……當n很大時,比較的次數是巨大的。
分治演算法,就是把問題分解為同一性質的子問題,再講子問題分解(遞迴),直到分解出的問題(最小子問題)可以直接求解。然後由這個解再一層層地回到原問題,同時在此過程中得到對應層的解。
遞迴地兩個要素:
1.基線條件(base case):迴圈呼叫的結束。也就是上面說的可以直接求解的「最小子問題」。
2.遞迴條件(recursive case):繼續呼叫自己的條件。也就是將問題繼續分解。
例如:n! = n*(n-1)*(n-2)***1
def f(n):
if n == 1: # 基線條件
return 1
else: # 遞迴條件
return n * f(n)
查詢演算法:二分法(binary search)
排序演算法:快速排序(quick sort)、歸併排序(merge sort)
最接近點對問題( closest pair of points)
strassen矩陣乘法( strassen』s algorithm)
傅利葉變換( cooley–tukey fast fourier transform (fft) algorithm)
快速排序:
def quick_sort(array):
if len(array) < 2: # 基線條件——最小子問題:陣列中只有1個或0個數字,則無需再排序
return array
else: # 遞迴條件——繼續分解
pivot = array[0]
less = [i for i in array[1:] if i <= pivot]
greater = [i for i in array[1:] if i > pivot]
return quick_sort(less) + [pivot] + quick_sort(greater)
分而治之思想
當乙個問題的規模很大時,直接求解往往比較困難。對於這類問題,很大一部分是可以採取分而治之的思想來處理的。分治法是把問題劃分成多個子問題來進行處理。這些子問題,在結構上跟原來的問題一樣,但是規模比原來的問題要小。如果得到的子問題還是比較大,那麼可以接著細分,一直細分到可以接受的程度為止。這樣就可以用迭...
在工作中使用分而治之的思想
分而治之,是將大問題分解為小問題,然後求解每個小問題,最終完成求解剛開始的大問題的一種思想和方法。分而治之是演算法中經常採用的一種思路,其實,在日常的工作中,我們也可以採用分而治之的思想更好的完成自己的工作。前幾天,自己收到乙個任務,程式完成後,在進行完必要的效能優化後,經過計算,發現仍然需要20個...
「分而治之」的策略
孫子曰 凡治眾如治寡,分數是也 鬥眾如鬥寡,形名是也 孫子兵法 兵勢篇 所謂 分數 曹操注釋為 部曲為分,什伍為數 所謂 形名 曹注為 旌旗曰形,金鼓曰名。這話的意思是 治理龐大的軍隊如同治理少量的軍隊的方法,就是按一定編制將他們組織起來,比如一軍分三師 一師分三旅 一旅分三團,直至一排分三班 讓龐...