Comp 122, Fall 2004
Dynamic Programming
dynprog - 2 Lin / Devi
Comp 122, Spring 2004
Longest Common Subsequence
 Problem: Given 2 sequences, X = x1,...,xm and
Y = y1,...,yn, find a common subsequence whose
length is maximum.
springtime ncaa tournament basketball
printing north carolina krzyzewski
Subsequence need not be consecutive, but must be in order.
dynprog - 3 Lin / Devi
Comp 122, Spring 2004
Other sequence questions
 Edit distance: Given 2 sequences, X = x1,...,xm
and Y = y1,...,yn, what is the minimum number of
deletions, insertions, and changes that you must do
to change one to another?
 Protein sequence alignment: Given a score matrix
on amino acid pairs, s(a,b) for a,b{}A,
and 2 amino acid sequences, X = x1,...,xmAm
and Y = y1,...,ynAn, find the alignment with
lowest score…
dynprog - 4 Lin / Devi
Comp 122, Spring 2004
More problems
Optimal BST: Given sequence K = k1 < k2 <··· < kn
of n sorted keys, with a search probability pi for
each key ki, build a binary search tree (BST) with
minimum expected search cost.
Matrix chain multiplication: Given a sequence of
matrices A1 A2 … An, with Ai of dimension mini,
insert parenthesis to minimize the total number of
scalar multiplications.
Minimum convex decomposition of a polygon,
Hydrogen placement in protein structures, …
dynprog - 5 Lin / Devi
Comp 122, Spring 2004
Dynamic Programming
 Dynamic Programming is an algorithm design technique for
optimization problems: often minimizing or maximizing.
 Like divide and conquer, DP solves problems by combining
solutions to subproblems.
 Unlike divide and conquer, subproblems are not independent.
» Subproblems may share subsubproblems,
» However, solution to one subproblem may not affect the solutions to other
subproblems of the same problem. (More on this later.)
 DP reduces computation by
» Solving subproblems in a bottom-up fashion.
» Storing solution to a subproblem the first time it is solved.
» Looking up the solution when subproblem is encountered again.
 Key: determine structure of optimal solutions
dynprog - 6 Lin / Devi
Comp 122, Spring 2004
Steps in Dynamic Programming
1. Characterize structure of an optimal solution.
2. Define value of optimal solution recursively.
3. Compute optimal solution values either top-
down with caching or bottom-up in a table.
4. Construct an optimal solution from computed
values.
We’ll study these with the help of examples.
dynprog - 7 Lin / Devi
Comp 122, Spring 2004
Longest Common Subsequence
 Problem: Given 2 sequences, X = x1,...,xm and
Y = y1,...,yn, find a common subsequence whose
length is maximum.
springtime ncaa tournament basketball
printing north carolina snoeyink
Subsequence need not be consecutive, but must be in order.
dynprog - 8 Lin / Devi
Comp 122, Spring 2004
Naïve Algorithm
 For every subsequence of X, check whether it’s a
subsequence of Y .
 Time: Θ(n2m).
» 2m subsequences of X to check.
» Each subsequence takes Θ(n) time to check:
scan Y for first letter, for second, and so on.
dynprog - 9 Lin / Devi
Comp 122, Spring 2004
Optimal Substructure
Notation:
prefix Xi = x1,...,xi is the first i letters of X.
This says what any longest common subsequence must look like;
do you believe it?
Theorem
Let Z = z1, . . . , zk be any LCS of X and Y .
1. If xm = yn, then zk = xm = yn and Zk-1 is an LCS of Xm-1 and Yn-1.
2. If xm  yn, then either zk  xm and Z is an LCS of Xm-1 and Y .
3. or zk  yn and Z is an LCS of X and Yn-1.
dynprog - 10 Lin / Devi
Comp 122, Spring 2004
Optimal Substructure
Proof: (case 1: xm = yn)
Any sequence Z’ that does not end in xm = yn can be made longer by adding xm = yn
to the end. Therefore,
(1) longest common subsequence (LCS) Z must end in xm = yn.
(2) Zk-1 is a common subsequence of Xm-1 and Yn-1, and
(3) there is no longer CS of Xm-1 and Yn-1, or Z would not be an LCS.
Theorem
Let Z = z1, . . . , zk be any LCS of X and Y .
1. If xm = yn, then zk = xm = yn and Zk-1 is an LCS of Xm-1 and Yn-1.
2. If xm  yn, then either zk  xm and Z is an LCS of Xm-1 and Y .
3. or zk  yn and Z is an LCS of X and Yn-1.
dynprog - 11 Lin / Devi
Comp 122, Spring 2004
Optimal Substructure
Proof: (case 2: xm  yn, and zk  xm)
Since Z does not end in xm,
(1) Z is a common subsequence of Xm-1 and Y, and
(2) there is no longer CS of Xm-1 and Y, or Z would not be an LCS.
Theorem
Let Z = z1, . . . , zk be any LCS of X and Y .
1. If xm = yn, then zk = xm = yn and Zk-1 is an LCS of Xm-1 and Yn-1.
2. If xm  yn, then either zk  xm and Z is an LCS of Xm-1 and Y .
3. or zk  yn and Z is an LCS of X and Yn-1.
dynprog - 12 Lin / Devi
Comp 122, Spring 2004
Recursive Solution
 Define c[i, j] = length of LCS of Xi and Yj .
 We want c[m,n].

















.
and
0
,
if
])
1
,
[
],
,
1
[
max(
,
and
0
,
if
1
]
1
,
1
[
,
0
or
0
if
0
]
,
[
j
i
j
i
y
x
j
i
j
i
c
j
i
c
y
x
j
i
j
i
c
j
i
j
i
c
This gives a recursive algorithm and solves the problem.
But does it solve it well?
dynprog - 13 Lin / Devi
Comp 122, Spring 2004
Recursive Solution









.
)
end(
)
end(
if
])
,
[
],
,
[
max(
,
)
end(
)
end(
if
1
]
,
[
,
empty
or
empty
if
0
]
,
[














prefix
c
prefix
c
prefix
prefix
c
c
c[springtime, printing]
c[springtim, printing] c[springtime, printin]
[springti, printing] [springtim, printin] [springtim, printin] [springtime, printi]
[springt, printing] [springti, printin] [springtim, printi] [springtime, print]
dynprog - 14 Lin / Devi
Comp 122, Spring 2004
Recursive Solution









.
)
end(
)
end(
if
])
,
[
],
,
[
max(
,
)
end(
)
end(
if
1
]
,
[
,
empty
or
empty
if
0
]
,
[














prefix
c
prefix
c
prefix
prefix
c
c
p r i n t i n g
s
p
r
i
n
g
t
i
m
e
•Keep track of c[,] in a
table of nm entries:
•top/down
•bottom/up
dynprog - 15 Lin / Devi
Comp 122, Spring 2004
Computing the length of an LCS
LCS-LENGTH (X, Y)
1. m ← length[X]
2. n ← length[Y]
3. for i ← 1 to m
4. do c[i, 0] ← 0
5. for j ← 0 to n
6. do c[0, j ] ← 0
7. for i ← 1 to m
8. do for j ← 1 to n
9. do if xi = yj
10. then c[i, j ] ← c[i1, j1] + 1
11. b[i, j ] ← “ ”
12. else if c[i1, j ] ≥ c[i, j1]
13. then c[i, j ] ← c[i 1, j ]
14. b[i, j ] ← “↑”
15. else c[i, j ] ← c[i, j1]
16. b[i, j ] ← “←”
17. return c and b
b[i, j ] points to table entry
whose subproblem we used
in solving LCS of Xi
and Yj.
c[m,n] contains the length
of an LCS of X and Y.
Time: O(mn)
dynprog - 16 Lin / Devi
Comp 122, Spring 2004
Constructing an LCS
PRINT-LCS (b, X, i, j)
1. if i = 0 or j = 0
2. then return
3. if b[i, j ] = “ ”
4. then PRINT-LCS(b, X, i1, j1)
5. print xi
6. elseif b[i, j ] = “↑”
7. then PRINT-LCS(b, X, i1, j)
8. else PRINT-LCS(b, X, i, j1)
•Initial call is PRINT-LCS (b, X,m, n).
•When b[i, j ] = , we have extended LCS by one character. So
LCS = entries with in them.
•Time: O(m+n)
dynprog - 17 Lin / Devi
Comp 122, Spring 2004
Steps in Dynamic Programming
1. Characterize structure of an optimal solution.
2. Define value of optimal solution recursively.
3. Compute optimal solution values either top-
down with caching or bottom-up in a table.
4. Construct an optimal solution from computed
values.
We’ll study these with the help of examples.
dynprog - 18 Lin / Devi
Comp 122, Spring 2004
Optimal Binary Search Trees
 Problem
» Given sequence K = k1 < k2 <··· < kn of n sorted keys,
with a search probability pi for each key ki.
» Want to build a binary search tree (BST)
with minimum expected search cost.
» Actual cost = # of items examined.
» For key ki, cost = depthT(ki)+1, where depthT(ki) = depth of ki in
BST T .
dynprog - 19 Lin / Devi
Comp 122, Spring 2004
Expected Search Cost

 


 










n
i
i
i
T
n
i
n
i
i
i
i
T
n
i
i
i
T
p
k
p
p
k
p
k
T
E
1
1 1
1
)
(
depth
1
)
(
depth
)
1
)
(
depth
(
]
in
cost
search
[
Sum of probabilities is 1.
(15.16)
dynprog - 20 Lin / Devi
Comp 122, Spring 2004
Example
 Consider 5 keys with these search probabilities:
p1 = 0.25, p2 = 0.2, p3 = 0.05, p4 = 0.2, p5 = 0.3.
k2
k1 k4
k3 k5
i depthT(ki) depthT(ki)·pi
1 1 0.25
2 0 0
3 2 0.1
4 1 0.2
5 2 0.6
1.15
Therefore, E[search cost] = 2.15.
dynprog - 21 Lin / Devi
Comp 122, Spring 2004
Example
 p1 = 0.25, p2 = 0.2, p3 = 0.05, p4 = 0.2, p5 = 0.3.
i depthT(ki) depthT(ki)·pi
1 1 0.25
2 0 0
3 3 0.15
4 2 0.4
5 1 0.3
1.10
Therefore, E[search cost] = 2.10.
k2
k1 k5
k4
k3 This tree turns out to be optimal for this set of keys.
dynprog - 22 Lin / Devi
Comp 122, Spring 2004
Example
 Observations:
» Optimal BST may not have smallest height.
» Optimal BST may not have highest-probability key at
root.
 Build by exhaustive checking?
» Construct each n-node BST.
» For each,
assign keys and compute expected search cost.
» But there are (4n/n3/2) different BSTs with n nodes.
dynprog - 23 Lin / Devi
Comp 122, Spring 2004
Optimal Substructure
 Any subtree of a BST contains keys in a contiguous range
ki, ..., kj for some 1 ≤ i ≤ j ≤ n.
 If T is an optimal BST and
T contains subtree T with keys ki, ... ,kj ,
then T must be an optimal BST for keys ki, ..., kj.
 Proof: Cut and paste.
T
T
dynprog - 24 Lin / Devi
Comp 122, Spring 2004
Optimal Substructure
 One of the keys in ki, …,kj, say kr, where i ≤ r ≤ j,
must be the root of an optimal subtree for these keys.
 Left subtree of kr contains ki,...,kr1.
 Right subtree of kr contains kr+1, ...,kj.
 To find an optimal BST:
» Examine all candidate roots kr , for i ≤ r ≤ j
» Determine all optimal BSTs containing ki,...,kr1 and
containing kr+1,...,kj
kr
ki kr-1 kr+1 kj
dynprog - 25 Lin / Devi
Comp 122, Spring 2004
Recursive Solution
 Find optimal BST for ki,...,kj, where i ≥ 1, j ≤ n, j ≥ i1.
When j = i1, the tree is empty.
 Define e[i, j ] = expected search cost of optimal BST for ki,...,kj.
 If j = i1, then e[i, j ] = 0.
 If j ≥ i,
» Select a root kr, for some i ≤ r ≤ j .
» Recursively make an optimal BSTs
• for ki,..,kr1 as the left subtree, and
• for kr+1,..,kj as the right subtree.
dynprog - 26 Lin / Devi
Comp 122, Spring 2004
Recursive Solution
 When the OPT subtree becomes a subtree of a node:
» Depth of every node in OPT subtree goes up by 1.
» Expected search cost increases by
 If kr is the root of an optimal BST for ki,..,kj :
» e[i, j ] = pr + (e[i, r1] + w(i, r1))+(e[r+1, j] + w(r+1, j))
= e[i, r1] + e[r+1, j] + w(i, j).
 But, we don’t know kr. Hence,



j
i
l
l
p
j
i
w )
,
( from (15.16)
(because w(i, j)=w(i,r1) + pr + w(r + 1, j))















j
i
j
i
w
j
r
e
r
i
e
i
j
j
i
e
j
r
i
if
)}
,
(
]
,
1
[
]
1
,
[
{
min
1
if
0
]
,
[
dynprog - 27 Lin / Devi
Comp 122, Spring 2004
Computing an Optimal Solution
For each subproblem (i,j), store:
 expected search cost in a table e[1 ..n+1 , 0 ..n]
» Will use only entries e[i, j ], where j ≥ i1.
 root[i, j ] = root of subtree with keys ki,..,kj, for 1 ≤ i ≤ j ≤ n.
 w[1..n+1, 0..n] = sum of probabilities
» w[i, i1] = 0 for 1 ≤ i ≤ n.
» w[i, j ] = w[i, j-1] + pj for 1 ≤ i ≤ j ≤ n.
dynprog - 28 Lin / Devi
Comp 122, Spring 2004
Pseudo-code
OPTIMAL-BST(p, q, n)
1. for i ← 1 to n + 1
2. do e[i, i 1] ← 0
3. w[i, i 1] ← 0
4. for l ← 1 to n
5. do for i ← 1 to nl + 1
6. do j ←i + l1
7. e[i, j ]←∞
8. w[i, j ] ← w[i, j1] + pj
9. for r ←i to j
10. do t ← e[i, r1] + e[r + 1, j ] + w[i, j ]
11. if t < e[i, j ]
12. then e[i, j ] ← t
13. root[i, j ] ←r
14. return e and root
Time: O(n3)
Consider all trees with l keys.
Fix the first key.
Fix the last key
Determine the root
of the optimal
(sub)tree
dynprog - 29 Lin / Devi
Comp 122, Spring 2004
Elements of Dynamic Programming
 Optimal substructure
 Overlapping subproblems
dynprog - 30 Lin / Devi
Comp 122, Spring 2004
Optimal Substructure
 Show that a solution to a problem consists of making a
choice, which leaves one or more subproblems to solve.
 Suppose that you are given this last choice that leads to an
optimal solution.
 Given this choice, determine which subproblems arise and
how to characterize the resulting space of subproblems.
 Show that the solutions to the subproblems used within
the optimal solution must themselves be optimal. Usually
use cut-and-paste.
 Need to ensure that a wide enough range of choices and
subproblems are considered.
dynprog - 31 Lin / Devi
Comp 122, Spring 2004
Optimal Substructure
 Optimal substructure varies across problem domains:
» 1. How many subproblems are used in an optimal solution.
» 2. How many choices in determining which subproblem(s) to
use.
 Informally, running time depends on (# of subproblems
overall)  (# of choices).
 How many subproblems and choices do the examples
considered contain?
 Dynamic programming uses optimal substructure bottom
up.
» First find optimal solutions to subproblems.
» Then choose which to use in optimal solution to the problem.
dynprog - 32 Lin / Devi
Comp 122, Spring 2004
Optimal Substucture
 Does optimal substructure apply to all optimization
problems? No.
 Applies to determining the shortest path but NOT the
longest simple path of an unweighted directed graph.
 Why?
» Shortest path has independent subproblems.
» Solution to one subproblem does not affect solution to another
subproblem of the same problem.
» Subproblems are not independent in longest simple path.
• Solution to one subproblem affects the solutions to other subproblems.
» Example:
dynprog - 33 Lin / Devi
Comp 122, Spring 2004
Overlapping Subproblems
 The space of subproblems must be “small”.
 The total number of distinct subproblems is a polynomial
in the input size.
» A recursive algorithm is exponential because it solves the same
problems repeatedly.
» If divide-and-conquer is applicable, then each problem solved
will be brand new.

17-dynprog2 17-dynprog2 17-dynprog2 17-dynprog2

  • 1.
    Comp 122, Fall2004 Dynamic Programming
  • 2.
    dynprog - 2Lin / Devi Comp 122, Spring 2004 Longest Common Subsequence  Problem: Given 2 sequences, X = x1,...,xm and Y = y1,...,yn, find a common subsequence whose length is maximum. springtime ncaa tournament basketball printing north carolina krzyzewski Subsequence need not be consecutive, but must be in order.
  • 3.
    dynprog - 3Lin / Devi Comp 122, Spring 2004 Other sequence questions  Edit distance: Given 2 sequences, X = x1,...,xm and Y = y1,...,yn, what is the minimum number of deletions, insertions, and changes that you must do to change one to another?  Protein sequence alignment: Given a score matrix on amino acid pairs, s(a,b) for a,b{}A, and 2 amino acid sequences, X = x1,...,xmAm and Y = y1,...,ynAn, find the alignment with lowest score…
  • 4.
    dynprog - 4Lin / Devi Comp 122, Spring 2004 More problems Optimal BST: Given sequence K = k1 < k2 <··· < kn of n sorted keys, with a search probability pi for each key ki, build a binary search tree (BST) with minimum expected search cost. Matrix chain multiplication: Given a sequence of matrices A1 A2 … An, with Ai of dimension mini, insert parenthesis to minimize the total number of scalar multiplications. Minimum convex decomposition of a polygon, Hydrogen placement in protein structures, …
  • 5.
    dynprog - 5Lin / Devi Comp 122, Spring 2004 Dynamic Programming  Dynamic Programming is an algorithm design technique for optimization problems: often minimizing or maximizing.  Like divide and conquer, DP solves problems by combining solutions to subproblems.  Unlike divide and conquer, subproblems are not independent. » Subproblems may share subsubproblems, » However, solution to one subproblem may not affect the solutions to other subproblems of the same problem. (More on this later.)  DP reduces computation by » Solving subproblems in a bottom-up fashion. » Storing solution to a subproblem the first time it is solved. » Looking up the solution when subproblem is encountered again.  Key: determine structure of optimal solutions
  • 6.
    dynprog - 6Lin / Devi Comp 122, Spring 2004 Steps in Dynamic Programming 1. Characterize structure of an optimal solution. 2. Define value of optimal solution recursively. 3. Compute optimal solution values either top- down with caching or bottom-up in a table. 4. Construct an optimal solution from computed values. We’ll study these with the help of examples.
  • 7.
    dynprog - 7Lin / Devi Comp 122, Spring 2004 Longest Common Subsequence  Problem: Given 2 sequences, X = x1,...,xm and Y = y1,...,yn, find a common subsequence whose length is maximum. springtime ncaa tournament basketball printing north carolina snoeyink Subsequence need not be consecutive, but must be in order.
  • 8.
    dynprog - 8Lin / Devi Comp 122, Spring 2004 Naïve Algorithm  For every subsequence of X, check whether it’s a subsequence of Y .  Time: Θ(n2m). » 2m subsequences of X to check. » Each subsequence takes Θ(n) time to check: scan Y for first letter, for second, and so on.
  • 9.
    dynprog - 9Lin / Devi Comp 122, Spring 2004 Optimal Substructure Notation: prefix Xi = x1,...,xi is the first i letters of X. This says what any longest common subsequence must look like; do you believe it? Theorem Let Z = z1, . . . , zk be any LCS of X and Y . 1. If xm = yn, then zk = xm = yn and Zk-1 is an LCS of Xm-1 and Yn-1. 2. If xm  yn, then either zk  xm and Z is an LCS of Xm-1 and Y . 3. or zk  yn and Z is an LCS of X and Yn-1.
  • 10.
    dynprog - 10Lin / Devi Comp 122, Spring 2004 Optimal Substructure Proof: (case 1: xm = yn) Any sequence Z’ that does not end in xm = yn can be made longer by adding xm = yn to the end. Therefore, (1) longest common subsequence (LCS) Z must end in xm = yn. (2) Zk-1 is a common subsequence of Xm-1 and Yn-1, and (3) there is no longer CS of Xm-1 and Yn-1, or Z would not be an LCS. Theorem Let Z = z1, . . . , zk be any LCS of X and Y . 1. If xm = yn, then zk = xm = yn and Zk-1 is an LCS of Xm-1 and Yn-1. 2. If xm  yn, then either zk  xm and Z is an LCS of Xm-1 and Y . 3. or zk  yn and Z is an LCS of X and Yn-1.
  • 11.
    dynprog - 11Lin / Devi Comp 122, Spring 2004 Optimal Substructure Proof: (case 2: xm  yn, and zk  xm) Since Z does not end in xm, (1) Z is a common subsequence of Xm-1 and Y, and (2) there is no longer CS of Xm-1 and Y, or Z would not be an LCS. Theorem Let Z = z1, . . . , zk be any LCS of X and Y . 1. If xm = yn, then zk = xm = yn and Zk-1 is an LCS of Xm-1 and Yn-1. 2. If xm  yn, then either zk  xm and Z is an LCS of Xm-1 and Y . 3. or zk  yn and Z is an LCS of X and Yn-1.
  • 12.
    dynprog - 12Lin / Devi Comp 122, Spring 2004 Recursive Solution  Define c[i, j] = length of LCS of Xi and Yj .  We want c[m,n].                  . and 0 , if ]) 1 , [ ], , 1 [ max( , and 0 , if 1 ] 1 , 1 [ , 0 or 0 if 0 ] , [ j i j i y x j i j i c j i c y x j i j i c j i j i c This gives a recursive algorithm and solves the problem. But does it solve it well?
  • 13.
    dynprog - 13Lin / Devi Comp 122, Spring 2004 Recursive Solution          . ) end( ) end( if ]) , [ ], , [ max( , ) end( ) end( if 1 ] , [ , empty or empty if 0 ] , [               prefix c prefix c prefix prefix c c c[springtime, printing] c[springtim, printing] c[springtime, printin] [springti, printing] [springtim, printin] [springtim, printin] [springtime, printi] [springt, printing] [springti, printin] [springtim, printi] [springtime, print]
  • 14.
    dynprog - 14Lin / Devi Comp 122, Spring 2004 Recursive Solution          . ) end( ) end( if ]) , [ ], , [ max( , ) end( ) end( if 1 ] , [ , empty or empty if 0 ] , [               prefix c prefix c prefix prefix c c p r i n t i n g s p r i n g t i m e •Keep track of c[,] in a table of nm entries: •top/down •bottom/up
  • 15.
    dynprog - 15Lin / Devi Comp 122, Spring 2004 Computing the length of an LCS LCS-LENGTH (X, Y) 1. m ← length[X] 2. n ← length[Y] 3. for i ← 1 to m 4. do c[i, 0] ← 0 5. for j ← 0 to n 6. do c[0, j ] ← 0 7. for i ← 1 to m 8. do for j ← 1 to n 9. do if xi = yj 10. then c[i, j ] ← c[i1, j1] + 1 11. b[i, j ] ← “ ” 12. else if c[i1, j ] ≥ c[i, j1] 13. then c[i, j ] ← c[i 1, j ] 14. b[i, j ] ← “↑” 15. else c[i, j ] ← c[i, j1] 16. b[i, j ] ← “←” 17. return c and b b[i, j ] points to table entry whose subproblem we used in solving LCS of Xi and Yj. c[m,n] contains the length of an LCS of X and Y. Time: O(mn)
  • 16.
    dynprog - 16Lin / Devi Comp 122, Spring 2004 Constructing an LCS PRINT-LCS (b, X, i, j) 1. if i = 0 or j = 0 2. then return 3. if b[i, j ] = “ ” 4. then PRINT-LCS(b, X, i1, j1) 5. print xi 6. elseif b[i, j ] = “↑” 7. then PRINT-LCS(b, X, i1, j) 8. else PRINT-LCS(b, X, i, j1) •Initial call is PRINT-LCS (b, X,m, n). •When b[i, j ] = , we have extended LCS by one character. So LCS = entries with in them. •Time: O(m+n)
  • 17.
    dynprog - 17Lin / Devi Comp 122, Spring 2004 Steps in Dynamic Programming 1. Characterize structure of an optimal solution. 2. Define value of optimal solution recursively. 3. Compute optimal solution values either top- down with caching or bottom-up in a table. 4. Construct an optimal solution from computed values. We’ll study these with the help of examples.
  • 18.
    dynprog - 18Lin / Devi Comp 122, Spring 2004 Optimal Binary Search Trees  Problem » Given sequence K = k1 < k2 <··· < kn of n sorted keys, with a search probability pi for each key ki. » Want to build a binary search tree (BST) with minimum expected search cost. » Actual cost = # of items examined. » For key ki, cost = depthT(ki)+1, where depthT(ki) = depth of ki in BST T .
  • 19.
    dynprog - 19Lin / Devi Comp 122, Spring 2004 Expected Search Cost                  n i i i T n i n i i i i T n i i i T p k p p k p k T E 1 1 1 1 ) ( depth 1 ) ( depth ) 1 ) ( depth ( ] in cost search [ Sum of probabilities is 1. (15.16)
  • 20.
    dynprog - 20Lin / Devi Comp 122, Spring 2004 Example  Consider 5 keys with these search probabilities: p1 = 0.25, p2 = 0.2, p3 = 0.05, p4 = 0.2, p5 = 0.3. k2 k1 k4 k3 k5 i depthT(ki) depthT(ki)·pi 1 1 0.25 2 0 0 3 2 0.1 4 1 0.2 5 2 0.6 1.15 Therefore, E[search cost] = 2.15.
  • 21.
    dynprog - 21Lin / Devi Comp 122, Spring 2004 Example  p1 = 0.25, p2 = 0.2, p3 = 0.05, p4 = 0.2, p5 = 0.3. i depthT(ki) depthT(ki)·pi 1 1 0.25 2 0 0 3 3 0.15 4 2 0.4 5 1 0.3 1.10 Therefore, E[search cost] = 2.10. k2 k1 k5 k4 k3 This tree turns out to be optimal for this set of keys.
  • 22.
    dynprog - 22Lin / Devi Comp 122, Spring 2004 Example  Observations: » Optimal BST may not have smallest height. » Optimal BST may not have highest-probability key at root.  Build by exhaustive checking? » Construct each n-node BST. » For each, assign keys and compute expected search cost. » But there are (4n/n3/2) different BSTs with n nodes.
  • 23.
    dynprog - 23Lin / Devi Comp 122, Spring 2004 Optimal Substructure  Any subtree of a BST contains keys in a contiguous range ki, ..., kj for some 1 ≤ i ≤ j ≤ n.  If T is an optimal BST and T contains subtree T with keys ki, ... ,kj , then T must be an optimal BST for keys ki, ..., kj.  Proof: Cut and paste. T T
  • 24.
    dynprog - 24Lin / Devi Comp 122, Spring 2004 Optimal Substructure  One of the keys in ki, …,kj, say kr, where i ≤ r ≤ j, must be the root of an optimal subtree for these keys.  Left subtree of kr contains ki,...,kr1.  Right subtree of kr contains kr+1, ...,kj.  To find an optimal BST: » Examine all candidate roots kr , for i ≤ r ≤ j » Determine all optimal BSTs containing ki,...,kr1 and containing kr+1,...,kj kr ki kr-1 kr+1 kj
  • 25.
    dynprog - 25Lin / Devi Comp 122, Spring 2004 Recursive Solution  Find optimal BST for ki,...,kj, where i ≥ 1, j ≤ n, j ≥ i1. When j = i1, the tree is empty.  Define e[i, j ] = expected search cost of optimal BST for ki,...,kj.  If j = i1, then e[i, j ] = 0.  If j ≥ i, » Select a root kr, for some i ≤ r ≤ j . » Recursively make an optimal BSTs • for ki,..,kr1 as the left subtree, and • for kr+1,..,kj as the right subtree.
  • 26.
    dynprog - 26Lin / Devi Comp 122, Spring 2004 Recursive Solution  When the OPT subtree becomes a subtree of a node: » Depth of every node in OPT subtree goes up by 1. » Expected search cost increases by  If kr is the root of an optimal BST for ki,..,kj : » e[i, j ] = pr + (e[i, r1] + w(i, r1))+(e[r+1, j] + w(r+1, j)) = e[i, r1] + e[r+1, j] + w(i, j).  But, we don’t know kr. Hence,    j i l l p j i w ) , ( from (15.16) (because w(i, j)=w(i,r1) + pr + w(r + 1, j))                j i j i w j r e r i e i j j i e j r i if )} , ( ] , 1 [ ] 1 , [ { min 1 if 0 ] , [
  • 27.
    dynprog - 27Lin / Devi Comp 122, Spring 2004 Computing an Optimal Solution For each subproblem (i,j), store:  expected search cost in a table e[1 ..n+1 , 0 ..n] » Will use only entries e[i, j ], where j ≥ i1.  root[i, j ] = root of subtree with keys ki,..,kj, for 1 ≤ i ≤ j ≤ n.  w[1..n+1, 0..n] = sum of probabilities » w[i, i1] = 0 for 1 ≤ i ≤ n. » w[i, j ] = w[i, j-1] + pj for 1 ≤ i ≤ j ≤ n.
  • 28.
    dynprog - 28Lin / Devi Comp 122, Spring 2004 Pseudo-code OPTIMAL-BST(p, q, n) 1. for i ← 1 to n + 1 2. do e[i, i 1] ← 0 3. w[i, i 1] ← 0 4. for l ← 1 to n 5. do for i ← 1 to nl + 1 6. do j ←i + l1 7. e[i, j ]←∞ 8. w[i, j ] ← w[i, j1] + pj 9. for r ←i to j 10. do t ← e[i, r1] + e[r + 1, j ] + w[i, j ] 11. if t < e[i, j ] 12. then e[i, j ] ← t 13. root[i, j ] ←r 14. return e and root Time: O(n3) Consider all trees with l keys. Fix the first key. Fix the last key Determine the root of the optimal (sub)tree
  • 29.
    dynprog - 29Lin / Devi Comp 122, Spring 2004 Elements of Dynamic Programming  Optimal substructure  Overlapping subproblems
  • 30.
    dynprog - 30Lin / Devi Comp 122, Spring 2004 Optimal Substructure  Show that a solution to a problem consists of making a choice, which leaves one or more subproblems to solve.  Suppose that you are given this last choice that leads to an optimal solution.  Given this choice, determine which subproblems arise and how to characterize the resulting space of subproblems.  Show that the solutions to the subproblems used within the optimal solution must themselves be optimal. Usually use cut-and-paste.  Need to ensure that a wide enough range of choices and subproblems are considered.
  • 31.
    dynprog - 31Lin / Devi Comp 122, Spring 2004 Optimal Substructure  Optimal substructure varies across problem domains: » 1. How many subproblems are used in an optimal solution. » 2. How many choices in determining which subproblem(s) to use.  Informally, running time depends on (# of subproblems overall)  (# of choices).  How many subproblems and choices do the examples considered contain?  Dynamic programming uses optimal substructure bottom up. » First find optimal solutions to subproblems. » Then choose which to use in optimal solution to the problem.
  • 32.
    dynprog - 32Lin / Devi Comp 122, Spring 2004 Optimal Substucture  Does optimal substructure apply to all optimization problems? No.  Applies to determining the shortest path but NOT the longest simple path of an unweighted directed graph.  Why? » Shortest path has independent subproblems. » Solution to one subproblem does not affect solution to another subproblem of the same problem. » Subproblems are not independent in longest simple path. • Solution to one subproblem affects the solutions to other subproblems. » Example:
  • 33.
    dynprog - 33Lin / Devi Comp 122, Spring 2004 Overlapping Subproblems  The space of subproblems must be “small”.  The total number of distinct subproblems is a polynomial in the input size. » A recursive algorithm is exponential because it solves the same problems repeatedly. » If divide-and-conquer is applicable, then each problem solved will be brand new.