分而治之的思想

2021-08-21 14:36:07 字數 1311 閱讀 7903

分治(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個...

「分而治之」的策略

孫子曰 凡治眾如治寡,分數是也 鬥眾如鬥寡,形名是也 孫子兵法 兵勢篇 所謂 分數 曹操注釋為 部曲為分,什伍為數 所謂 形名 曹注為 旌旗曰形,金鼓曰名。這話的意思是 治理龐大的軍隊如同治理少量的軍隊的方法,就是按一定編制將他們組織起來,比如一軍分三師 一師分三旅 一旅分三團,直至一排分三班 讓龐...