複習算法之分而治之算法

概述

分而治之算法把一個問題實例分解爲若干個小型而獨立的實例,從而可以在並行計算機上執行。直到求得小型而獨立的實例的解,即原問題的解是實例解的合併。

算法思想

分而治之算法與軟件設計的模塊化方法非常相似。一個問題的小實例可以用直接方法求解。而要解決一個問題的大實例,可以:

  1. 分解:把它分成兩個或更多個更小的實例
  2. 求解:分別求解出每個小實例
  3. 合併:把這些小實例的解組合成原始大實例的解,小實例通常是原問題的實例,可以使用分而治之策略遞歸求解。

算法效率

分而治之算法是很多高效算法的基礎,例如:Karatsuba快速乘法算法、快速排序算法和並行算法、矩陣乘法的施特拉森算法、快速傅里葉變換等。

示例

分而治之算法在高級語言中主要的一個思想是遞歸,這邊要說下遞歸函數也是分而治之的一種算法。
以下是歸併排序的示例代碼,形參中array[]爲排序數組,first爲起始索引,last爲終止索引。

void merge_sort(int array[], unsigned int first, unsigned int last) {
     int mid = 0;
     if(first<last)     {
         mid = (first+last)/2;
         merge_sort(array, first, mid);
         merge_sort(array, mid+1,last);
         merge(array,first,mid,last);
     } }

在程式中可以看出分治法的應用:在merge_sort()中,將原來針對索引first到last的數組排序的問題,分爲二份較小的問題
先針對索引first到mid的數組排序。
再針對索引mid+1到last的數組排序。
最後再進行二個數組的合併。

經典例子

(1)二分搜索 例如16個硬幣中有一個是僞造的(較輕),可以採用分治算法選出僞造的硬幣
(2)大整數乘法
(3)Strassen矩陣乘法
(4)棋盤覆蓋
(5)合併排序
(6)快速排序
(7)線性時間選擇
(8)最接近點對問題
(9)循環賽日程表
(10)漢諾塔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章