演算法第二篇之分治

akbarken發表於2014-09-11
演算法基本思想:大致可分為如下幾類:分治演算法、貪心演算法、動態規劃、回溯法、分支限界、概率演算法和隨機演算法等等

分治演算法

 分治即分而治之。一個問題規模過大不容易直接解決,就可以劃分成許多小問題,如果小問題不容易求解,那麼可以再劃分成規模更小的問題,直到規模小到很容易解決為止,解決這些小問題,再將小問題的解合併成大問題的解。

分治演算法常用的實現方法是遞迴

遞迴

遞迴,就是在函式內部呼叫本函式自身。形式如下

void foo()

{         //
        foo();   //遞迴
         //
}
例子:
階乘
Fibonacci數列
漢諾塔問題
全排列問題

經典問題

(1)二分搜尋

(2)大整數乘法

(3)Strassen矩陣乘法

(4)棋盤覆蓋

(5)合併排序

(6)快速排序

(7)線性時間選擇

(8)最接近點對問題

(9)迴圈賽日程表

二分搜尋

問題:從一個已經排好序的序列中,查詢某一個元素。

1. 將陣列從中間分成上下兩半,如果中間的值剛好是要查詢的元素,直接輸出結果。

2. 如果中間的值比要查詢的大,那麼說明要查詢的元素只可能出現在上半段,再對上半段進行二分搜尋。

3. 如果中間的值比要查詢的小,那麼說明要查詢的元素只可能出現在下半段,再對下半段進行二分搜尋。

盤覆蓋

問題:  在一個2k×2個方格組成的棋盤中,恰有一個方格與其它方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的L型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個L型骨牌不得重疊覆蓋。

      

分析:   當k>0時,將2k×2k棋盤分割為4個2k-1×2k-1子棋盤(a)所示。

特殊方格必位於4個較小子棋盤之一中,其餘3個子棋盤中無特殊方格。為了將這3個無特殊方格的子棋盤轉化為特殊棋盤,可以用一個L型骨牌覆蓋這3個較小棋盤的會合處,如 (b)所示,可以把黃色的方格看做是較小棋盤的特殊方格,從而將原問題轉化為4個較小規模的棋盤覆蓋問題。


遞迴地使用這種分割,直至棋盤簡化為棋盤1×1。


相關文章