演算法筆記之演算法思想 分治演算法

2021-10-01 18:00:25 字數 1270 閱讀 5905

分治演算法(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.分治演算法的使用條件 分治法所能解決的問題一般具有以下幾個...

分治思想之排序演算法

分而治之是設計高效演算法的乙個重要思想。本文主要總結一下分治思想在排序演算法中的運用。排序在商業資料處理和現代科學計算中有著重要的地位,它能夠應用於事物處理 組合優化 天體物理學 分子動力學 語言學 基因組學 天氣預報和很多其它領域。演算法 發展至今,已經出現過很多的排序演算法。如選擇排序,插入排序...