View
521
Download
4
Category
Preview:
DESCRIPTION
Citation preview
Dynamic Programming
Dynamic Programming
Dynamic Programming is a general algorithm design technique. “Programming” here means “planning”.
Invented by American mathematician Richard Bellman in the 1950s to solve optimization problems
Main idea: solve several smaller (overlapping) subproblemsrecord solutions in a table so that each subproblem is only solved
oncefinal state of the table will be (or contain) solution
Dynamic programming vs. divide-and-conquerpartition a problem into overlapping subproblems and
independent onesstore and not store solutions to subproblems
Example: Fibonacci numbers
• Recall definition of Fibonacci numbers:f(0) = 0f(1) = 1f(n) = f(n-1) + f(n-2)
• Computing the nth Fibonacci number recursively (top-down):
f(n)
f(n-1) + f(n-2)
f(n-2) + f(n-3) f(n-3) + f(n-4)
...
Example: Fibonacci numbers
Computing the nth fibonacci number using bottom-up iteration:
• f(0) = 0• f(1) = 1• f(2) = 0+1 = 1• f(3) = 1+1 = 2• f(4) = 1+2 = 3• f(5) = 2+3 = 5•••• f(n-2) = • f(n-1) = • f(n) = f(n-1) + f(n-2)
ALGORITHM Fib(n)F[0] 0, F[1] 1for i 2 to n do
F[i] F[i-1] + F[i-2]return F[n]
extra space
Examples of Dynamic Programming Algorithms
Computing binomial coefficients
Warshall’s algorithm for transitive closure
Floyd’s algorithms for all-pairs shortest paths
Constructing an optimal binary search tree
Some instances of difficult discrete optimization problems:
knapsack
Computing Binomial Coefficients
A binomial coefficient, denoted C(n, k), is the number of combinations of k elements from an n-element set (0 ≤ k ≤ n).Recurrence relation (a problem 2 overlapping problems)
C(n, k) = C(n-1, k-1) + C(n-1, k), for n > k > 0, and C(n, 0) = C(n, n) = 1
Dynamic programming solution:Record the values of the binomial coefficients in a table of n+1rows and k+1 columns, numbered from 0 to n and 0 to krespectively.
11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1…
Transitive ClosureThe transitive closure of a directed graph with n vertices can be
defined as the nxn matrix T = {tij}, in which the element in the ith row (1 ≤ i ≤ n) and the jth column (1 ≤ j ≤ n) is 1 if there exists a nontrivial directed path (i.e., a directed path of a positive length) from the ith vertex to the jth vertex; otherwise, tij is 0.
Graph traversal-based algorithm and Warshall’s algorithm
3
42
13
42
1
0 0 1 01 1 11 1 10 0 0 011 1 1 1
0 0 1 01 0 0 10 0 0 00 1 0 0
Adjacency matrix 1 1Transitive closure
Warshall’s Algorithm•• Main idea: Use a bottom-up method to construct the transitive closure of a given digraph with n vertices through a series of nxn boolean matrices:
R(0),…, R(k-1), R(k) , …, R(n)
The question is: how to obtain R(k) from R(k-1) ?
3
42
13
42
1
R(0)
0 0 1 01 0 0 10 0 0 00 1 0 0
Does not allow an intermediate node
3
42
13
42
1
R(1)
0 0 1 01 0 11 10 0 0 00 1 0 0
R(2)
0 0 1 01 0 1 10 0 0 01 1 1 1 11 1
R(3)
0 0 1 01 0 1 10 0 0 01 1 1 1
Allow 1,2,3 to be an intermediate node
R(4)
0 0 1 01 11 1 10 0 0 01 1 1 1
Allow 1,2,3,4 to be an intermediate node
3
42
1
R(k) : rij(k) = 1 in R(k) , iff
there is an edge from i to j; orthere is a path from i to j going through vertex 1; orthere is a path from i to j going through vertex 1 and/or 2; or
...there is a path from i to j going through 1, 2, … and/or k
Allow 1 to be an intermediate node
Allow 1,2 to be an intermediate node
Warshall’s AlgorithmIn theIn the kkthth stage: to determine stage: to determine RR(k(k)) is to determine if a path exists is to determine if a path exists between two vertices between two vertices i, j i, j using just vertices among 1,…,using just vertices among 1,…,k k
rrijij(k(k--1)1) = 1 = 1 (path using just 1 ,…,(path using just 1 ,…,kk--11))
rrijij(k(k)) = 1: or = 1: or
((rrikik(k(k--1)1) = 1 and = 1 and rrkjkj
(k(k--1)1)) = 1 ) = 1 (path from (path from i i to to kkand from and from kk to to iiusing just 1 ,…,using just 1 ,…,kk--1)1)
j
kkth stage
{Rule to determine whether rij
(k) should be 1 in R(k) :
• If an element rij is 1 in R(k-1) , it remains 1 in R(k) .
• If an element rij is 0 in R(k-1) ,it has to be changed to 1 in R(k) iff the element in its row i and column k and the element in its column j and row k are both 1’s in R(k-1).
i
Floyd’s Algorithm: All pairs shortest paths
All pairs shortest paths problem: In a weighted graph, find shortest paths between every pair of vertices.
Applicable to: undirected and directed weighted graphs; no negative weight.
Same idea as the Warshall’s algorithm : construct solution through series of matrices D(0) , D(1), …, D(n)
Example:3
42
14
16
1
5
3
0 ∞ 4 ∞1 0 6 3 ∞ ∞ 0 ∞∞ 5 1 0
0 ∞ 4 ∞1 0 5 3 ∞ ∞ 0 ∞6 5 1 0
weight matrix distance matrix
dij(k) = length of the
shortest path from i to j with each vertex numbered no higher than k.
Floyd’s Algorithm
DD(k(k)) : allow 1, 2, …, k to be intermediate vertices.: allow 1, 2, …, k to be intermediate vertices.In theIn the kkthth stage, determine whether the introduction of stage, determine whether the introduction of kk as a new eligible as a new eligible intermediate vertex will bring about a shorter path from i to j.intermediate vertex will bring about a shorter path from i to j.
ddijij(k(k) ) = min{= min{ddijij
(k(k--1) 1) , , ddikik(k(k--1)1) + + ddkjkj
(k(k--11} for } for k k ≥≥ 1, 1, ddijij(0) = (0) = wwijij
i
jdij
(k-1)
dkj(k-1)
kdik(k-1)
kth stage
General Comments
The crucial step in designing a dynamic programming algorithm:
Deriving a recurrence relating a solution to the problem’s current instance with solutions of its smaller ( and overlapping) subinstances.
The Knapsack Problem and Memory Functions (1)
The problemFind the most valuable subset of the given n items that fit into a knapsack of capacity W.
Consider the following subproblem P(i, j)Find the most valuable subset of the first i items that fit into a knapsack of capacity j, where 1 ≤ i ≤n, and 1≤ j ≤ WLet V[i, j] be the value of an optimal solution to the above subproblem P(i, j). Goal: V[n, W] The question: What is the recurrence relation that expresses a solution to this instance in terms of solutions to smaller subinstances?
The Knapsack Problem and Memory Functions (2)
The RecurrenceTwo possibilities for the most valuable subset for the subproblem P(i, j)
It does not include the ith item: V[i, j] = V[i-1, j]It includes the ith item: V[i, j] = vi+ V[i-1, j – wi]
V[i, j] = max{V[i-1, j], vi+ V[i-1, j – wi] }, if j – wi ≥ 0V[i-1, j] if j – wi < 0
V[0, j] = 0 for j ≥ 0 and V[i, 0] = 0 for i ≥ 0
{
Memory FunctionsMemory functions: a combination of the top-down and bottom-up method. The idea is to solve the subproblems that are necessary and do it only once.
Top-down: solve common subproblems more than once.Bottom-up: Solve subproblems whose solution are not necessary for the solving the original problem.
ALGORITHM MFKnapsack(i, j)if V[i, j] < 0 //if subproblem P(i, j) hasn’t been solved yet.
if j < Weights[i]value MFKnapsack(i – 1, j)
elsevalue max(MFKnapsack(i – 1, j),
values[I] + MFKnapsck( i – 1, j – Weights[i]))V[i, j] value
return V[i, j]
Recommended