演算法設計方法 分治法 分而治之 簡介

2021-07-30 04:53:20 字數 922 閱讀 7126

1. 分而治之(divide-and-conquer)(分治法)可能是最著名的通用演算法設計技術了。雖然它的名氣可能和它那好記的名字有關,但它的確是當之無愧的:很多非常有效的演算法實際上就是這個通用演算法的特殊實現。"分治"名字本身就已經給出了一種強有力的演算法設計技術,它可以用來解決各類問題。

2. 分治法是按照以下方案工作的:

(1)將待解決問題的例項劃分為同乙個問題的兩個或多個較小的例項,較小問題最好擁有同樣的規模。

(2)對這些較小問題的例項求解(一般使用遞迴方法,但在問題規模足夠小時,也會利用另乙個演算法)。

(3)如果必要的話,合併這些較小問題的解,以得到原始問題的解。

如果較小的問題規模還是太大,難以輕鬆解決,就可以針對每個較小的問題再進行劃分,一直持續劃分過程,知道問題規模小到可以輕鬆解決為止。在設計分而治之演算法時,我們通常將它編寫為遞迴過程。在此之後,我們有時可以為該演算法設計乙個更高效的迭代版本。

3. 不是所有的分治演算法都一定要比蠻力求解演算法更高效。但是,通常使用分治演算法所用的時間往往比其他方法要少。實際上,分治法孕育了電腦科學中許多最重要和最有效的演算法。雖然,許多這類演算法的經典例子大部分都為順序演算法,但應該知道,分治法對於平行計算也是非常理想的,因為各個子問題都可以由各自的cpu同時計算。

4. 在分治演算法最典型的應用中,問題規模為n的例項往往被劃分為兩個規模為n/2的例項。更一般的情況下,問題規模為n的例項被劃分為b個規模為n/b的例項(其中a個例項需要求解,a>=1,b>=1,a,b為常量)。從理論上分析分治演算法執行時間的過程中,往往使用遞推公式進行數學分析(離散數學中的遞推關係)。

為了簡化分析,我們假設n是b的冪,對於演算法的執行時間t(n),我們有以下遞推式:  t(n) = at(n/b) + f(n) (f(n)是乙個函式,表示將b個較小規模問題的解合併起來所消耗的時間),該遞推公式被稱為通用分治遞推式。顯然,t(n)的增長次數取決於常量a和b以及f(n)的增長。

常見演算法設計方法 分治法

歸併排序就是常見的一種採用 分治法 進行設計的演算法,以下先給出具體的c 版 示例 對列表進行遞迴排序 待排序陣列 public static listsort listlist 合併已經排序好的兩個list left list right list private static listmerge...

演算法 分治法

include function 列印int型陣列 parameter int型陣列,陣列的長度 void displayarray int a,int n printf n function 劃分由下標s開始到t終止的int陣列 parameter int型陣列,陣列的起始座標,陣列的終點座標 r...

演算法設計與分析基礎 分治法

1.將乙個問題劃分為同一型別的若干子問題,子問題最好規模相同 2.對子問題求解 一般使用遞迴方法 3.有必要的話,合併子問題的解,得到原始問題的答案 下圖描述的是將乙個問題劃分為兩個較小子問題的例子,也是最常見的情況 1.主要思想 對於乙個需要排序的陣列a 0 n 1 將其一分為二 a 0 n 2 ...