d&c, dp

28

Upload: larue

Post on 21-Jan-2016

55 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

Page 1: D&C, DP
Page 2: D&C, DP

D&C, DPDivide and Conquer

Dynamic Programming

Page 3: D&C, DP

Recursive Method…

Big Problem!!!

Sub-Problem

Sub-Problem

Sub-Problem

Big Problem!!!

Page 4: D&C, DP

Three major steps

Big Problem!!!Sub-Problem

Divide Sub-

ProblemSub-

ProblemSolved SolvedSolved

Conquer

Solved SolvedSolved

Merge

Solved!!!

Page 5: D&C, DP

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

Page 6: D&C, DP

Tiling Problem with L-shaped Tile

Page 7: D&C, DP

Fast Exponentiation

7^13= ?

7^13 =

96889010407

Page 8: D&C, DP

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

Page 9: D&C, DP

Binary Search

Exception(Prune and search)

Kth smallest(related to Quick sort)

Page 10: D&C, DP

Dynamic  動態

Dynamic Programming( 動態規劃 )

Programming 最佳化(Optimization)DP 運用”動態”的方式求最佳解

Page 11: D&C, 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

Page 12: D&C, DP

讀取、計算、儲存

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)

Page 13: D&C, DP

讀取、計算、儲存

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

Page 14: D&C, DP

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)

Page 15: D&C, DP

DP 的時間、空間複雜度

f(0)

f(1)

f(2)

f(3)

f(4)

1 1 2 3 5

空間複雜度 : 以子問題的出現期間決定。空間複雜度 :O(n)空間複雜度 :O(1)

Page 16: D&C, DP

1. 發現相似的求解方式,紀錄重複的子問題資訊 。

Note on DP

3. 確認初始值、問題的計算範圍。

2. 決定問題的計算順序。

Page 17: D&C, DP

1.Top-down, Recursive way.

Practice in Dp

2.Bottom-up, Iterative way.

Page 18: D&C, DP

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)

Page 19: D&C, DP

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]

Page 20: D&C, DP

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( 不好的示範 )

Page 21: D&C, DP

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

Page 22: D&C, DP

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.}

Page 23: D&C, DP

Stairs Climbing(Top-down)

f(0)

f(1)

f(2)

f(3)

f(4)

  1. 好處是不必斤斤計較計算順序。

f(n) = f(n-1) + f(n-2)

2. 只計算必要的問題,而不必計算整個陣列。

Page 24: D&C, DP

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. 無法自由地控制計算順序,無法妥善運用記憶體。

Page 25: D&C, DP

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

Page 26: D&C, DP

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] = ?

這個方式的好處與壞處恰與前一個方式互補。

其特色是程式碼通常只有幾個迴圈。

Page 27: D&C, DP

1. 找出結構相似之處 (recursion) ,設計一套公式(recurrence) 。

The Summary of D&C, DP

靈感 =

3.To iterate is man, to recurse is divine.

2. 可考慮使用表格紀錄出現頻繁的子問題數值。

+ 智慧

經驗

Page 28: D&C, DP

D&C1103862010230920374

UVA

DP623 9001106910446495