五大常用算法:分治算法

一、基本概念

在計算機科學中,分治法是一種很重要的算法。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題解的合併。這個技巧是很多高效算法的基礎,如排序算法(快速排序,歸併排序),傅里葉變換(快速傅里葉變換)……

任何一個可以用計算機求解的問題所需的計算時間都與其規模有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。例如,對於 n 個元素的排序問題,當 n = 1 時,不需要任何計算。n = 2 時,只要作一次比較即可排好序。n = 3 時只要作 3 次比較即可…… 。而當 n 較大時,問題就不那麼容易處理了。要想直接解決一個規模較大的問題,有時是相當困難的。

二、基本思路及策略

分治法的設計思想是:將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。

分治策略是:對於一個規模爲 n 的問題,若該問題可以容易地解決(比如 n 規模較小)則直接解決,否則將其分解爲 k 個規模較小的問題,這些子問題互相獨立且與原問題形式相同,遞歸的解決這些子問題,然後將各子問題的解合併得到原問題的解。這種算法設計策略叫做分治法。

如果原問題可以分割成 k 個子問題,1 < k <= n, 且這些子問題都可解並可以利用這些子問題的解求出原問題的解,那麼這種分治法就是可行的。由分治法產生的子問題往往是原問題的較小模式,這就爲使用遞歸技術提供了方便。在這種情況下,反覆應用分治手段,可以使子問題與原問題類型一致而其規模卻不斷減小,最終使子問題縮小到很容易直接求出其解。這自然導致遞歸過程的產生。分治與遞歸像一對孿生兄弟,經常同時應用在算法設計之中,並由此產生許多高效算法。

三、分治法適用的情況

分治法所能解決的問題一般具有以下幾個特徵:

  1. 該問題的規模縮小到一定的程度就可以容易地解決
  2. 該問題可以分解爲若干規模較小的相同問題,即該問題具有最優子結構性質
  3. 利用該問題分解出的子問題的解可以合併爲該問題的解
  4. 該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題

第一條特徵是絕大多數問題都可以滿足的,因爲問題的計算複雜性一般是隨着問題規模的增加而增加;

第二條特徵是應用分治法的前提,它也是大多數問題可以滿足的,此特徵反映了遞歸思想的應用;

第三條特徵是關鍵,能否利用分治法完全取決於問題的是否具有第三條特徵,如果具備了第一條和第二條特徵,而不具備第三條特徵,則可以考慮用貪心法或動態規劃法。

第四條特徵涉及到分治法的效率,如果各子問題是不獨立的則分治法要做許多不必要的工作,重複地解決公共的子問題,此時雖然可用分治法,但一般用動態規劃較好。

四、分治法的基本步驟

分治法在每一層遞歸上都有三個步驟:

**step **1 分解:將原問題分解爲若干規模較小,相互獨立,與原問題形式相同的子問題;

**step **2 解決:若子問題規模較小而容易被解決則直接求解,否則遞歸地解各個子問題;

**step **3 合併:將各個子問題的解合併爲原問題的解。

五、可使用分治法求解的一些經典問題

  1. 二分搜索
  2. 大整數乘法
  3. Strassen 矩陣乘法
  4. 棋盤覆蓋
  5. 合併排序
  6. 快速排序
  7. 線性時間選擇
  8. 最接近點對問題
  9. 循環賽日程表
  10. 漢諾塔

六、依據分治法設計程序時的思維過程

實際上就是類似與數學歸納法,找到解決問題的求解方程式,然後根據方程式設計遞歸程序。

  1. 一定是先找到最小問題規模時的求解方法
  2. 然後考慮隨着問題規模增大時的解決方法
  3. 找到求解的遞歸函數式後,設計遞歸程序即可
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章