0% found this document useful (0 votes)
48 views

L09 DynamicProgramming - Part03

The document discusses the problem of finding the longest common subsequence between two sequences and presents an algorithm for solving it using dynamic programming. It first introduces the problem and gives a brute force solution with exponential time complexity. It then presents a recursive solution that uses a 2D table to store subproblems and builds up the solution in a bottom-up manner with polynomial time complexity.

Uploaded by

Enmusk
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
48 views

L09 DynamicProgramming - Part03

The document discusses the problem of finding the longest common subsequence between two sequences and presents an algorithm for solving it using dynamic programming. It first introduces the problem and gives a brute force solution with exponential time complexity. It then presents a recursive solution that uses a 2D table to store subproblems and builds up the solution in a bottom-up manner with polynomial time complexity.

Uploaded by

Enmusk
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 14

Lecture 09

Dynamic Programming

CSE373: Design
and Analysis of
Longest Common Subsequence
(LCS)

Given two sequences
X = x1, x2, …, xm
Y = y1, y2, …, yn
find a maximum length common subsequence (LCS)
of X and Y


Application: comparison of two DNA strings
Example

X = A, B, C, B, D, A, B X = A, B, C, B, D, A, B

Y = B, D, C, A, B, A Y = B, D, C, A, B, A


Both B, C, B, A and B, D, A, B are longest
common subsequences of X and Y (length = 4)


B, C, A, however is not a LCS of X and Y
Brute-Force Solution

For every subsequence of X, check whether it’s a
subsequence of Y


There are 2m subsequences of X to check


Each subsequence takes (n) time to check
• scan Y for first letter, from there scan for second, and so
on


Running time: (n2m)
LCS Recursive Solution

First we’ll find the length of LCS. Later we’ll modify
the algorithm to find LCS itself.

Define Xi, Yj to be the prefixes of X and Y of length i
and j respectively

Define c[i,j] to be the length of LCS of Xi and Yj

Then the length of LCS of X and Y will be c[m,n]
LCS Recursive Solution

We start with i = j = 0 (empty substrings of x and y)

Since X0 and Y0 are empty strings, their LCS is
always empty (i.e. c[0,0] = 0)

LCS of empty string and any other string is empty, so
for every i and j: c[0, j] = c[i,0] = 0
LCS Recursive Solution

When we calculate c[i,j], we consider two cases:

First case: x[i]=y[j]:
• one more symbol in strings X and Y matches, so the
length of LCS Xi and Yj equals to the length of LCS of
smaller strings Xi-1 and Yi-1 , plus 1

 c[i  1, j  1] 1 if x[i ]  y[ j ],
c[i, j ] 

LCS Recursive Solution

Second case: x[i] != y[j]
• As symbols don’t match, our solution is not improved, and
the length of LCS(Xi , Yj) is the same as before (i.e.
maximum of LCS(Xi, Yj-1) and LCS(Xi-1,Yj)

 c[i  1, j  1] 1 if x[i ]  y[ j ],
c[i, j ] 
 max( c[i, j  1], c[i  1, j ]) otherwise

Why not just take the length of LCS(Xi-1, Yj-1) ?


Computing the Length of the LCS
0 if i = 0 or j = 0
c[i, j] = c[i-1, j-1] + 1 if xi = yj
max(c[i, j-1], c[i-1, j]) if xi  yj

0 1 2 n
yj: y1 y2 yn
0 xi 0 0 0 0 0 0
1 x1 0 first
2 x2 0 second
i
0
0
m xm 0
j
Additional Information
0 if i,j = 0
c[i, j] = c[i-1, j-1] + 1 if xi = yj
max(c[i, j-1], c[i-1, j]) if xi  yj

0 1 2 3 n A matrix b[i, j]:


b & c: yj: A C D F •
For a subproblem [i, j] it tells us
what choice was made to obtain
0 xi 0 0 0 0 0 0 the optimal value
1 A 0 •
If xi = yj
2 B b[i, j] = “ ”
0 c[i-1,j] •
Else, if c[i - 1, j] ≥ c[i, j-1]
i
3 C 0 c[i,j-1] b[i, j] = “  ”
else
0
b[i, j] = “  ”
m D 0
j
LCS-LENGTH(X, Y, m, n)
1. for i ← 1 to m
2. do c[i, 0] ← 0 The length of the LCS if one of the sequences
is empty is zero
3. for j ← 0 to n
4. do c[0, j] ← 0
5. for i ← 1 to m
6. do for j ← 1 to n Case 1: xi = yj
7. do if xi = yj
8. then c[i, j] ← c[i - 1, j - 1] + 1
9. b[i, j ] ← “ ” Case 2: xi  yj

10. else if c[i - 1, j] ≥ c[i, j - 1]


11. then c[i, j] ← c[i - 1, j]
12. b[i, j] ← “↑” Running time: (mn)
13. else c[i, j] ← c[i, j - 1]
Example
X = A, B, C, B, D, A
0 if i = 0 or j = 0
Y = B, D, C, A, B, A c[i, j] = c[i-1, j-1] + 1 if xi = yj
max(c[i, j-1], c[i-1, j]) if xi  yj
0 1 2 3 4 5 6
If xi = yj yj B D C A B A
b[i, j] = “ ” 0 xi 0 0 0 0 0 0 0
Else if c[i - 11, j]A≥ 0

0

0

0 1 1 1
c[i, j-1] 2 B 0 1 1 1

1 2 2
b[i, j] = “  ” 3 C    
0 1 1 2 2 2 2
else 4 B   
0 1 1 2 2 3 3
b[i, j] = “  ”     
5 D 0 1 2 2 2 3 3
   
6 A 0 1 2 2 3 3 4
   
7 B 0 1 2 2 3 4 4
4. Constructing a LCS

Start at b[m, n] and follow the arrows

When we encounter a “ “ in b[i, j]  xi = yj is an element of
the LCS
0 1 2 3 4 5 6
yj B D C A B A
0 xi 0 0 0 0 0 0 0
1 A   
0 0 0 0 1 1 1
2 B 
0 1 1 1 1 2 2
3 C    
0 1 1 2 2 2 2
  
4 B 0 1 1 2 2 3 3
    
5 D 0 1 2 2 2 3 3
   
6 A 0 1 2 2 3 3 4
   
7 B 0 1 2 2 3 4 4
PRINT-LCS(b, X, i, j)
1. if i = 0 or j = 0
Running time: (m + n)
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: PRINT-LCS(b, X, length[X], length[Y])

You might also like