dynamic programming cisc5835 algorithms for big data cis
play

Dynamic Programming CISC5835, Algorithms for Big Data CIS, Fordham - PowerPoint PPT Presentation

Dynamic Programming CISC5835, Algorithms for Big Data CIS, Fordham Univ. Instructor: X. Zhang Rod Cutting Problem A company buys long steel rods (of length n), and cuts them into shorter one to sell integral length only cutting is


  1. Dynamic Programming CISC5835, Algorithms for Big Data CIS, Fordham Univ. Instructor: X. Zhang

  2. Rod Cutting Problem • A company buys long steel rods (of length n), and cuts them into shorter one to sell • integral length only • cutting is free • rods of diff lengths sold for diff. price, e.g., • Best way to cut the rods? • n=4: no cutting: $9, 1 and 3: 1+8=$9, 2 and 2: 5+5=$10 • n=5: ? 2

  3. Rod Cutting Problem Formulation • Input: • a rod of length n • a table of prices p[1…n] where p[i] is price for rod of length i • Output • determine maximum revenue r n obtained by cutting up the rod and selling all pieces • Analysis solution space (how many possibilities?) • how many ways to write n as sum of positive integers? • 4=4, 4=1+3, 4=2+2 • # of ways to cut n: 3

  4. Rod Cutting Problem Formulation • // return r_n: max. revenue • int Cut_Rod (int p[1…n], int n) • Divide-and-conquer? • how to divide it into smaller one? • we don’t know we want to cut in half… 4

  5. Rod Cutting Problem • // return r n : max. revenue for rod of length n • int Cut_Rod (int n, int p[1…n]) • Start from small • n=1, r 1 =1 //no possible cutting • n=2, r 2 =5 // no cutting (if cut, revenue is 2) • n=3, r 3 =8 //no cutting • r 4 =9 (max. of p[4], p[1]+r 3 , p[2]+r 3, p[3]+r 1 ) • r 5 = max (p[5], p[1]+r 4 , p[2]+r 2 , p[3]+r 2 , p[4]+r 1 ) • … 5

  6. Rod Cutting Problem • // return r n : max. revenue for rod size n • int Cut_Rod (int n, int p[1…n]) • Given a rod of length n, consider first rod to cut out • if we don’t cut it at all, max. revenue is p[n] • if first rod to cut is1: max. revenue is p[1]+r n-1 • if first rod to cut out is 2: max. revenue is p[2]+r n-2, … • max. revenue is given by maximum among all the above options • r n = max (p[n], p[1]+r n-1 , p[2]+r n-2 , …, p[n-1]+r 1 ) 6

  7. Optimal substructure • // return r n : max. revenue for rod size n • int Cut_Rod (int n, int p[1…n]) • r n = max (p[n], p[1]+r n-1 , p[2]+r n-2 , …, p[n-1]+r 1 ) • Optimal substructure : Optimal solution to a problem of size n incorporates optimal solutions to problems of smaller size (1, 2, 3, … n-1). 7

  8. Rod Cutting Problem • // return r_n: max. revenue for rod size n • int Cut_Rod (int p[1…n], int n) • r n = max (p[n], p[1]+r n-1 , p[2]+r n-2 , …, p[n-1]+r 1 ) 8

  9. Recursive Rod Cutting • // return r_n: max. revenue for rod size n Running time T(n) • int Cut_Rod (int p[1…n], int n) Closed formula: T(n)=2 n Recursive calling tree: n=4 9

  10. Subproblems Graph • Avoid recomputing subproblems again and again by storing subproblems solutions in memory/table (hence “programming”) • trade-off between space and time • Overlapping of subproblems 10

  11. Dynamic Programming • Avoid recomputing subproblems again and again by storing subproblems solutions in memory/ table (hence “programming”) • trade-off between space and time • Two-way to organize • top-down with memoization • Before recursive function call, check if subproblem has been solved before • After recursive function call, store result in table • bottom-up method • Iteratively solve smaller problems first, move the way up to larger problems 11

  12. Memoized Cut-Rod // stores solutions to all problems // initialize to an impossible negative value // A recursive function // If problem of given size (n) has been solved before, just return the stored result // same as before… 12

  13. Memoized Cut-Rod: running time // stores solutions to all problems // initialize to an impossible negative value // A recursive function // If problem of given size (n) has been solved before, just return the stored result // same as before… 13

  14. Bottom-up Cut-Rod // stores solutions to all problems // Solve subproblem j, using solution to smaller subproblems Running time: 1+2+3+..+n-1=O(n 2 ) 14

  15. Bottom-up Cut-Rod (2) // stores solutions to all problems What if we want to know who to achieve r[n]? i.e., how to cut? i.e., n=n_1+n_2+…n_k, such that p[n_1]+p[n_2]+…+p[n_k]=r n 15

  16. Recap • We analyze rod cutting problem • Optimal way to cut a rod of size n is found by • 1) comparing optimal revenues achievable after cutting out the first rod of varying len, • This relates solution to larger problem to solutions to subproblems • 2) choose the one yield largest revenue 16

  17. maximum (contiguous) subarray • Problem: find the contiguous subarray within an array ( containing at least one number ) which has largest sum (midterm lab) • If given the array [-2,1,-3,4,-1,2,1,-5,4], • contiguous subarray [4,-1,2,1] has largest sum = 6 • Solution to midterm lab • brute-force: n 2 or n 3 • Divide-and-conquer: T(n)=2 T(n/2)+O(n), T(n)=nlogn • Dynamic programming? 17

  18. Analyze optimal solution • Problem: find contiguous subarray with largest sum • Sample Input: [-2,1,-3,4,-1,2,1,-5,4] (array of size n=9) • How does solution to this problem relates to smaller subproblem? • If we divide-up array (as in midterm) • [-2,1,-3,4,-1,2,1,-5,4] //find MaxSub in this array [-2,1,-3,4,-1] [2,1,-5,4] still need to consider subarray that spans both halves This does not lead to a dynamic programming sol. • Need a different way to define smaller subproblems! 18

  19. Analyze optimal solution • Problem: find contiguous subarray with largest sum A Index • MSE(k), max. subarray ending at pos k, among all subarray ending at k (A[i…k] where i<=k), the one with largest sum • MSE(1), max. subarray ending at pos 1, is A[1..1], sum is -2 • MSE(2), max. subarray ending at pos 2, is A[2..2], sum is 1 MSE(3) is A[2..3], sum is -2 • • MSE(4)? 19

  20. Analyze optimal solution • A • Index • MSE(k) and optimal substructure • MSE(3): A[2..3], sum is -2 (red box) • MSE(4): two options to choose • (1) either grow MSE(3) to include pos 4 How a problem’s optimal solution can be derived from • subarray is then A[2..4], sum is optimal solution to smaller MSE(3)+A[4]=-2+A[4]=2 problem • (2) or start afresh from pos 4 • subarray is then A[4…4], sum is A[4]=4 (better) • Choose the one with larger sum, i.e., • MSE(4) = max (A[4], MSE(3)+A[4]) 20

  21. Analyze optimal solution • A • Index • MSE(4)=4, array is A[4…4] • MSE(k) and optimal substructure • Max. subarray ending at k is the larger between A[k…k] and Max. subarray ending at k-1 extended to include A[k] MSE(k) = max (A[k], MSE(k-1)+A[k]) • MSE(5)= , subarray is • MSE(6) • MSE(7) • MSE(8) • MSE(9) 21

  22. Analyze optimal solution • A • Index • Once we calculate MSE(1) … MSE(9) • MSE(1)=-2, the subarray is A[1..1] • MSE(2)=1, the subarray is A[2..2] • MSE(3)=-2, the subarray is A[2..3] • MSE(4)=4, the subarray is A[4…4] • … MSE(7)=6, the subarray is A[4…7] • MSE(9)=4, the subarray is A[9…9] • What’s the maximum subarray of A? • well, it either ends at 1, or ends at 2, …, or ends at 9 • Whichever yields the largest sum! 22

  23. Idea to Pseudocode • A • Index (int, start,end) MaxSubArray (int A[1…n]) • Calculate MSE(1) … MSE(n) { // Use array MSE to store the MSE(i) • MSE(1)= A[1] MSE[1]=A[1]; • MSE(i) = max (A[i], A[i]+MSE(i-1)); max_MSE = MSE[1]; • Return maximum among all MSE(i), for (int i=2;i<=n;i++) for i=1, 2, …n { MSE[i] = ?? if (MSE[i] > max_MSE) { max_MSE = MSE[i]; Practice: end = i; 1) fill in ?? } 2) How to find out the starting index of } the max. subarray, i.e., the start parameter? return (max_MSE, start, end) } 23

  24. Running time Analysis int MaxSubArray (int A[1…n], int & start, • It’s easy to see that int & end) running time is O(n) { // Use array MSE to store the MSE(i) • a loop that iterates MSE[1]=A[1]; for n-1 times max_MSE = MSE[1]; • Recall other solutions: for (int i=2;i<=n;i++) { • brute-force: n 2 or n 3 MSE[i] = ?? • Divide-and-conquer: if (MSE[i] > max_MSE) { nlogn max_MSE = MSE[i]; • Dynamic programming end = i; } wins! } return max_MSE; } 24

  25. What is DP? When to use? • We have seen several optimization problems • brute force solution • divide and conquer • dynamic programming • To what kinds of problem is DP applicable? • Optimal substructure : Optimal solution to a problem of size n incorporates optimal solution to problem of smaller size (1, 2, 3, … n-1). • Overlapping subproblems : small subproblem space and common subproblems 25

  26. Optimal substructure • Optimal substructure : Optimal solution to a problem of size n incorporates optimal solution to problem of smaller size (1, 2, 3, … n-1). • Rod cutting: find r n (max. revenue for rod of len n) Sol to problem Sol to problem instance of size n instance of size n-1, n-2, … 1 r n = max (p[1]+r n-1 , p[2]+r n-2 , p[3]+r n-3 ,…, p[n-1]+r 1, p[n]) • A recurrence relation (recursive formula) • => Dynamic Programming: Build an optimal solution to the problem from solutions to subproblems • We solve a range of sub-problems as needed 26

Recommend


More recommend