d&c, dp
DESCRIPTION
D&C, DP. Divide and Conquer Dynamic Programming. Recursive Method…. Big Problem!!!. Big Problem!!!. Sub-Problem. Sub-Problem. Sub-Problem. Three major steps. Big Problem!!!. Solved!!!. Conquer. Divide. Merge. Sub-Problem. Solved. Sub-Problem. Solved. Sub-Problem. Solved. - PowerPoint PPT PresentationTRANSCRIPT
D&C, DPDivide and Conquer
Dynamic Programming
Recursive Method…
Big Problem!!!
Sub-Problem
Sub-Problem
Sub-Problem
Big Problem!!!
Three major steps
Big Problem!!!Sub-Problem
Divide Sub-
ProblemSub-
ProblemSolved SolvedSolved
Conquer
Solved SolvedSolved
Merge
Solved!!!
Stairs Climbing
眼前有四階樓梯,每次可踏上一階或踏上兩階,那麼爬完四階共有幾種踏法?= +
f(4) = f(3) + f(2)
= +
f(3)
f(1)
f(2)
= +3 2 1
每次可踏上一階或踏上兩階
= +
f(4)
f(2)
f(3)
= +5 3 2
Tiling Problem with L-shaped Tile
Fast Exponentiation
7^13= ?
7^13 =
96889010407
7^13 = 7^7 * 7^6
7^6 = 7^3 * 7^3
7^3 = 7^2 * 7^1
7^7 = 7^4 * 7^3
7^4 = 7^2 * 7^2
7^2 = 7^1 * 7^17^1= 7
Binary Search
Exception(Prune and search)
Kth smallest(related to Quick sort)
Dynamic 動態
Dynamic Programming( 動態規劃 )
Programming 最佳化(Optimization)DP 運用”動態”的方式求最佳解
DP 可視為 D&C 的延伸
f(4)
f(0)
f(1)
f(3)
f(2)
f(2)
f(1)
f(0)
f(1)
f(0)
f(1)
f(2)
f(3)
f (4)
1 1 2 3 5
Overlapping
讀取、計算、儲存
f(4)
f(0)
f(1)
f(3)
f(2)
f(2)
f(1)
f(0)
f(1)
f(0)
f(1)
f(2)
f(3)
f(4)
f(4) = f(3) + f(2)
f(3) = f(2) + f(1)f(2) = f(0) + f(1)
讀取、計算、儲存
f(4)
f(0)
f(1)
f(3)
f(2)
f(2)
f(1)
f(0)
f(1)
f(0)
f(1)
f(2)
f(3)
f(4)
1 1
f(0) = 1
f(1) = 1
f(0)
f(1)
f(2)
f(3)
f(4)
1 1 2 3
f(3) = 3
f(2) = 2
f(0)
f(1)
f(2)
f(3)
f(4)
1 1 2 3 5
f(4) = 5
DP 的時間、空間複雜度
f(0)
f(1)
f(2)
f(3)
f(4)
1 1 2 3 5
時間複雜度 :O(1)
時間複雜度 :O(s)
f(n) = f(n-1) + f(n-2)
時間複雜度 :O(n)
時間複雜度 :O(n*s*1)
DP 的時間、空間複雜度
f(0)
f(1)
f(2)
f(3)
f(4)
1 1 2 3 5
空間複雜度 : 以子問題的出現期間決定。空間複雜度 :O(n)空間複雜度 :O(1)
1. 發現相似的求解方式,紀錄重複的子問題資訊 。
Note on DP
3. 確認初始值、問題的計算範圍。
2. 決定問題的計算順序。
1.Top-down, Recursive way.
Practice in Dp
2.Bottom-up, Iterative way.
Stairs Climbing( 初步思考 )
f(n) = { 1 , if n = 1 { 2 , if n = 2 { f(n-1) + f(n-2) , if n >= 3
No
f(1)
f(2)
f(3)
f(4)
Stairs Climbing( 美觀 )
f(0)
f(1)
f(2)
f(3)
f(4)
f(n) = { 0 , if n < 0 [Exterior] { 1 , if n = 0 [Initial] { 1 , if n = 1 [Initial] { f(n-1) + f(n-2) , if n >= 2 and n <= 5 [Compute] { 0 , if n > 5 [Exterior]
1.int f(int n)2.{3. if (n == 0 || n == 1)4. return 1;5. else6. return f(n-1) + f(n-2);7.}
Stairs Climbing( 不好的示範 )
Stairs Climbing(Two ways)
f(4)
f(0)
f(1)
f(3)
f(2)
f(2)
f(1)
f(0)
f(1)
1.Top-down, Recursive.
2. Bottom-up, Iterative.
f(0)
f(1)
f(2)
f(3)
f(4)
1 1 2 3 5
Stairs Climbing(Top-down) 1.int table[5]; // 表格,儲存全部問題的答案。2.bool solve[5]; // 記錄問題是否已計算3. 4.int f(int n)5.{6. if (n == 0 || n == 1)7. return 1;8. 9. if (solve[n])10. return table[n];11. 12. table[n] = f(n-1) + f(n-2); // 將答案存入表格13. solve[n] = true; // 紀錄已計算14. 15. return table[n];16.}
Stairs Climbing(Top-down)
f(0)
f(1)
f(2)
f(3)
f(4)
1. 好處是不必斤斤計較計算順序。
f(n) = f(n-1) + f(n-2)
2. 只計算必要的問題,而不必計算整個陣列。
Stairs Climbing(Top-down)
1. 壞處是不斷呼叫函式,執行效率較差。
f(4)
f(0)
f(1)
f(3)
f(2)
f(2)
f(1)
f(0)
f(1)
f(n) = f(n-1) + f(n-2)
2. 無法自由地控制計算順序,無法妥善運用記憶體。
Stairs Climbing(Bottom-up)
Int table[5];table[0] = 1;table[ 1] = 1;
1.int table[5];2. 3.void dp()4.{5. // initial6. for (int i=0; i<=4; i++)7. table[i] = 0;8. 9. table[0] = 1;10. table[1] = 1;11. 12. // compute13. for (int i=2; i<=4; i++)14. table[i] = table[i-1] + table[i-2];15.}
f(0)
f(1)
f(2)
f(3)
f(4)
f(0)
f(1)
f(2)
f(3)
f(4)
1 1
Stairs Climbing(Bottom-up)
訂定一個計算順序,然後由最小的問題開始計算。
for (int i=2; i<=5; i++) table[i] = table[i-1] + table[i-2];
table[2] = ?
for (int i=0; i<=5; i++) table[i] = 0;table[3] =
?table[4] = ?
這個方式的好處與壞處恰與前一個方式互補。
其特色是程式碼通常只有幾個迴圈。
1. 找出結構相似之處 (recursion) ,設計一套公式(recurrence) 。
The Summary of D&C, DP
靈感 =
3.To iterate is man, to recurse is divine.
2. 可考慮使用表格紀錄出現頻繁的子問題數值。
+ 智慧
經驗
D&C1103862010230920374
UVA
DP623 9001106910446495