MIT演算法導論公開課之第3課 分治法
阿新 • • 發佈:2019-02-19
分治法
1. 將一個問題劃分為若干個子問題。
2. 遞迴的解決每一個子問題。
3. 將子問題的解合併成為整個大問題的解。
歸併排序
1. 將一個數組分為兩個子陣列。
2. 遞迴的對每一個子陣列進行排序。
3. 合併兩個有序子陣列。
- 執行時間
遞迴函式為T(n)=2T(n/2)+Θ(n)。
使用主方法,為case2 ,所以T(n)= Θ(nlgn)。
二分查詢
在有序陣列中查詢數X。
1. 把數X與陣列中間元素比較,得到X所在的子陣列。
2. 遞迴的在這個子陣列查詢X。
3. 無。
- 執行時間:
遞迴函式為T(n)=T(n/2)+Θ(1)。
使用遞迴樹法T(n)= Θ(lgn)。
乘方問題:
有實數X和正整數n計算X^n。
當n為偶數時,X^n=X^(n/2)·X^(n/2),當n為奇數時,X^n=X^((n-1)/2)·X^((n-1)/2)·X。
- 執行時間:
遞迴函式為T(n)=T(n/2)+Θ(1)。
使用遞迴樹法T(n)= Θ(lgn)。
斐波那契數列
基本公式法: Fn=0 (n=0) Fn=1 (n=1) Fn=F(n-1)+F(n-2)(n>=2) 執行時間: Ω(φ^n) φ=(1+5^(1/2))/2。 自下而上遞迴法: 依次計算F0,F1,F2 …… Fn。 執行時間:Θ(n)。 樸素平方遞迴式: Fn=φ^n/5^(1/2)結果取最接近的整數。 執行時間:Θ(lgn)。 此演算法中的值需用浮點數表示受計算機位數限制。 無法用計算機編碼實現。 平方遞迴式: (F(n+1) Fn) = (1 1)n (Fn F(n-1)) (1 0) 執行時間:Θ(lgn) 證明方法可採用歸納法: 1. (F2 F1) = (1 1)1 (F1 F0) (1 0) 2. (F(n+1) Fn) = (Fn F(n-1)) (1 1) (Fn F(n-1)) (F(n-1) F(n-2)) (1 0) 由定義可知上式成立。
矩陣乘法
- 輸入:兩個矩陣A[aij]和B[bij] 1<=i<=n 1<=j<=n
- 輸出:矩陣C[cij]=A[aij]·B[bij]
- 基本演算法:
- 偽碼
for i ← 1 to n
do for j ← 1 to n
cij=0
do for k ← 1 to n
do cij ← cij+aik·bkj
執行時間為Θ(n^3)
- 矩陣分塊法:
- 斯特拉森(Strassen)演算法:
目前最快的理論演算法執行時間大約在O(n^2.376)(這個目前指的是網課授課的日期)。
超大規模積體電路(VLSI)佈局
假設有一個完全二叉樹,在網格上將其放到晶片佈局上,有n個葉節點,要在網格上佔據最小空間。
- 樸素演算法:
- 改進演算法:
Area為Θ(n)。