分治演算法(divide and conquer)的核心思想其實就是四個字,分而治之 ,也就是將原問題劃分成 n 個規模較小,並且結構與原問題相似的子問題,遞迴地解決這些子問題,然後再合併其結果,就得到原問題的解。
分治演算法是一種處理問題的思想,遞迴是一種程式設計技巧。實際上,分治演算法一般都比較適合用遞迴來實現。分治演算法的遞迴實現中,每一層遞迴都會涉及這樣三個操作:
分治演算法能解決的問題,一般需要滿足下面這幾個條件:
如何程式設計求出一組資料的有序對個數或者逆序對個數呢?
可以將陣列分成前後兩半 a1 和 a2,分別計算 a1 和 a2 的逆序對個數 k1 和 k2,然後再計算 a1 與 a2 之間的逆序對個數 k3。那陣列 a 的逆序對個數就等於 k1+k2+k3。
如何快速計算出兩個子問題 a1 與 a2 之間的逆序對個數呢?歸併排序演算法
歸併排序中有乙個非常關鍵的操作,就是將兩個有序的小陣列,合併成乙個有序的陣列。實際上,在這個合併的過程中,我們就可以計算這兩個小陣列的逆序對個數了。每次合併操作,我們都計算逆序對個數,把這些計算出來的逆序對個數求和,就是這個陣列的逆序對個數了。
// 全域性變數或者成員變數
public
intcount
(int
a,int n)
private
void
mergesortcounting
(int
a,int p,
int r)
private
void
merge
(int
a,int p,
int q,
int r)
else
}while
(i <= q)
while
(j <= r)
for(i =
0; i <= r-p;
++i)
}可以將海量的資料集合根據某種方法,劃分為幾個小的資料集合,每個小的資料集合單獨載入到記憶體來解決,然後再將小資料集合合併成大資料集合。實際上,利用這種分治的處理思路,不僅僅能克服記憶體的限制,還能利用多執行緒或者多機處理,加快處理的速度。
分治演算法用四個字概括就是「分而治之」,將原問題劃分成 n 個規模較小而結構與原問題相似的子問題,遞迴地解決這些子問題,然後再合併其結果,就得到原問題的解;
演算法思想 分治演算法
分而治之 大問題能夠拆成相似的小問題,記住這些小問題需要具有相似性。而後將小問題的每個解合成為大問題的解。所以說大問題如何拆,小問題如何合併才是這個演算法最主要的乙個思想。實際上很多演算法如貪心演算法,動態規劃等等都是要求把大問題拆成小問題。而分治演算法的重要一點就是要適用於能夠重新把小問題的解合併...
分治演算法思想
1.分解 對這k個子問題分別求解。如果子問題的規模仍然不夠小,則再劃分為k個子問題,如此遞迴的進行下去,直到問題規模足夠小,很容易求出其解為止。2.合併 將求出的小規模的問題的解合併為乙個更大規模的問題的解,自底向上逐步求出原來問題的解。3.分治演算法的使用條件 分治法所能解決的問題一般具有以下幾個...
分治思想之排序演算法
分而治之是設計高效演算法的乙個重要思想。本文主要總結一下分治思想在排序演算法中的運用。排序在商業資料處理和現代科學計算中有著重要的地位,它能夠應用於事物處理 組合優化 天體物理學 分子動力學 語言學 基因組學 天氣預報和很多其它領域。演算法 發展至今,已經出現過很多的排序演算法。如選擇排序,插入排序...