[Algorithm]分治法 Divide and Conquer 與 主定理 Master Theorem


警:此文是理論深度文,如果想從這里找源代碼或者“神馬是歸並排序”之類的東西的話,提前放棄吧。這文的來源主要是MIT的算法導論。

主定理 Master Theorem

這中文名字十分蛋疼(其實英文名字也十分蛋疼),我感覺確切地應該叫做遞歸復雜度判定定理,不過姑且就這么用吧。

分治法 Divide and Conquer

分治法分為三步:分、治、合(Divide, Conquer, Combine)。

分是遞歸的,不是說分一次就結束了,分后的子問題,被看做一個完整的問題,再進行分的過程,否則,算法的復雜度是不會降低的。

分治法的時間復雜度計算

使用公式:

然后套用主定理求解,PS:不適用主定理時,就悲劇鳥~

分治法舉例

歸並排序 Merge Sort

too simple, something naive了,簡單說下就是:分成子隊列、子隊列排序、合並子隊列。這一過程迭代執行

公式:

套用主定理第2種情況,得

二分查找

更加simple:先和隊列中點比較,選擇結果的位置,然后再從子隊列中查找。這一過程迭代執行。隊列必須是有序的。

公式:

套用主定理第1種情況,得

求冪值ax

分治法不是唯一的方法,這和前邊兩個不大一樣,確切說小標題應該是“用分治法求冪值”

簡單說是先求ax/2,然后再求ax/2*ax/2得出結果,當然,這一步驟也是要遞歸的。

公式:

套用主定理第1種情況,得

矩陣乘法

正常的算法,套用公式

使用i、j、k三重循環,復雜度為n3

使用分治法,將矩陣分塊,進行分塊相乘(主方法第一種情況):

是不能降低復雜度的,悲了個摧。

Strassen's Algorithm

http://en.wikipedia.org/wiki/Strassen_algorithm

應用這個算法,可以將復雜度降低一點點……

時間復雜度是

求斐波那契數值 Fibonacci Numbers

多說一句,如果用遞歸求斐波那契,則

斐波那契無法直接使用分治法求解,不過其計算公式可以使用分治法求值。

這是錯誤的方法:

斐波那契近似計算公式

其中的冪值計算可以使用分治法,最終復雜度為

不過計算機無法精確計算浮點數,也就是說會存在誤差累積的問題~(另外據說大數乘法也不是常數時間,據說而已)

所以不可行。

這是正確的方法,使用了線性代數:

斐波那契計算公式

硬件布線

分治法還可以有神奇的用途,例如計算硬件布線占用的電路板面積:

方案1下的:

目標方案的:

可以反推出

如果有靈感的話,可以得出H布局


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM