lcs_new

Upload: pptdownload81

Post on 03-Jun-2018

221 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/12/2019 lcs_new

    1/34

    A Presentation

    Dynamic programming

    Longest Common Subsequenc(LCS)

    By: Pradeep Kumar(AP)

    Dept of CSE&MCA

    7/15/2014 1

  • 8/12/2019 lcs_new

    2/34

    It is used, when the solution can be recursivelydescribed in terms of solutions to subproblems

    (optimal substructure)

    Algorithm finds solutions to subproblems and storesthem in memory for later use

    More efficient than brute-force methods, which

    solve the same subproblems over and over again

    7/15/2014 2

  • 8/12/2019 lcs_new

    3/34

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

    Well study these with the help of examples.

    7/15/2014 3

  • 8/12/2019 lcs_new

    4/34

    Application: comparison of two DNA strings

    Ex: X= {A B C B D A B }, Y= {B D C A B A}

    Longest Common Subsequence:

    X = A B C BD AB

    Y = BD CA B A

    Brute force algorithm would compare each subsequence ofX with the symbols in Y

    7/15/2014 4

  • 8/12/2019 lcs_new

    5/34

    if |X| = m, |Y| = n, then there are 2msubsequences of x;

    we must compare each with Y (n comparisons)

    So the running time of the brute-force algorithm is O(n

    2m)

    Notice that the LCS problem has optimal substructure:

    solutions of subproblems are parts of the final solution.

    Subproblems: find LCS of pairs ofprefixesof X and Y

    7/15/2014 5

  • 8/12/2019 lcs_new

    6/34

    First well find the length of LCS. Later well modify the

    algorithm to find LCS itself.

    DefineXi, Yjto be the prefixes of X and Y of length iand

    jrespectively

    Define c[i,j]to be the length of LCS ofXi

    and Yj

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

    7/15/2014 6

    otherwise]),1[],1,[max(

    ],[][if1]1,1[],[

    jicjic

    jyixjicjic

  • 8/12/2019 lcs_new

    7/347/15/2014 7

  • 8/12/2019 lcs_new

    8/34

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

    Since X0and Y0are empty strings, their LCS is alwaysempty (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

    7/15/2014 8

    otherwise]),1[],1,[max(

    ],[][if1]1,1[

    ],[ jicjic

    jyixjic

    jic

  • 8/12/2019 lcs_new

    9/34

    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 LCSXiand Yjequals to the

    length of LCS of smaller strings Xi-1and Yi-1, plus 1

    7/15/2014 9

    otherwise]),1[],1,[max(],[][if1]1,1[],[

    jicjicjyixjicjic

  • 8/12/2019 lcs_new

    10/34

    Second case:x[i] != y[j]

    As symbols dont 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)

    7/15/2014 10

    otherwise]),1[],1,[max(

    ],[][if1]1,1[

    ],[ jicjic

    jyixjic

    jic

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

  • 8/12/2019 lcs_new

    11/34

    LCS-Length(X, Y)

    1. m = length(X) // get the # of symbols in X2. n = length(Y) // get the # of symbols in Y

    3. for i = 1 to m c[i,0] = 0 // special case: Y0

    4. for j = 1 to n c[0,j] = 0 // special case: X0

    5. for i = 1 to m // for all Xi

    6. for j = 1 to n // for all Yj

    7. if ( Xi== Yj)

    8. c[i,j] = c[i-1,j-1] + 19. else c[i,j] = max( c[i-1,j], c[i,j-1] )

    10. return c

    7/15/2014 11

  • 8/12/2019 lcs_new

    12/34

    Well see how LCS algorithm works on the following

    example:X = ABCB

    Y = BDCAB

    7/15/2014 12

    LCS(X, Y) = BCB

    X = A B C B

    Y = BD CA B

    What is the Longest Common Subsequence

    of X and Y?

  • 8/12/2019 lcs_new

    13/347/15/2014 13

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    X = ABCB; m = |X| = 4Y = BDCAB; n = |Y| = 5Allocate array c[5,4]

    ABCB

    BDCAB

  • 8/12/2019 lcs_new

    14/347/15/2014 14

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    for i = 1 to m c[i,0] = 0for j = 1 to n c[0,j] = 0

    ABCB

    BDCAB

  • 8/12/2019 lcs_new

    15/347/15/2014 15

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1])

    0

    ABCB

    BDCAB

  • 8/12/2019 lcs_new

    16/347/15/2014 16

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    0 0 0

    ABCB

    BDCAB

  • 8/12/2019 lcs_new

    17/347/15/2014 17

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    0 0 0 1

    ABCB

    BDCAB

  • 8/12/2019 lcs_new

    18/347/15/2014 18

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    000 1 1

    ABCB

    BDCAB

  • 8/12/2019 lcs_new

    19/347/15/2014 19

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    0 0 10 1

    1

    ABCB

    BDCAB

  • 8/12/2019 lcs_new

    20/34

    7/15/2014 20

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    1000 1

    1 1 11

    ABCB

    BDCAB

  • 8/12/2019 lcs_new

    21/34

    7/15/2014 21

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    1000 1

    1 1 1 1 2

    ABCB

    BDCAB

    A C

  • 8/12/2019 lcs_new

    22/34

    7/15/2014 22

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    1000 1

    21 1 11

    1 1

    ABCB

    BDCAB

    ABCB

  • 8/12/2019 lcs_new

    23/34

    7/15/2014 23

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    1000 1

    1 21 11

    1 1 2

    ABCB

    BDCAB

    ABCB

  • 8/12/2019 lcs_new

    24/34

    7/15/2014 24

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    1000 1

    1 21 1

    1 1 2

    1

    22

    ABCB

    BDCAB

    ABCB

  • 8/12/2019 lcs_new

    25/34

    7/15/2014 25

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    1000 1

    1 21 1

    1 1 2

    1

    22

    1

    ABCB

    BDCAB

    ABCB

  • 8/12/2019 lcs_new

    26/34

    7/15/2014 26

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    1000 1

    1 21 1

    1 1 2

    1

    22

    1 1 2 2

    ABCB

    BDCAB

    ABCB

  • 8/12/2019 lcs_new

    27/34

    7/15/2014 27

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    B

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    if ( Xi== Yj)c[i,j] = c[i-1,j-1] + 1

    else c[i,j] = max( c[i-1,j], c[i,j-1] )

    1000 1

    1 21 1

    1 1 2

    1

    22

    1 1 2 2 3

    ABCB

    BDCAB

  • 8/12/2019 lcs_new

    28/34

    LCS algorithm calculates the values of each entry of thearray c[m,n]

    So what is the running time?

    7/15/2014 28

    O(m*n)

    since each c[i,j] is calculated inconstant time, and there are m*n

    elements in the array

  • 8/12/2019 lcs_new

    29/34

    So far, we have just found the lengthof LCS, but not

    LCS itself.We want to modify this algorithm to make it output

    Longest Common Subsequence of X and Y

    Each c[i,j]depends on c[i-1,j] andc[i,j-1]

    or c[i-1, j-1]

    For each c[i,j] we can say how it was acquired:

    7/15/2014 29

    2

    2 3

    2 For example, here

    c[i,j] = c[i-1,j-1] +1 = 2+1=3

  • 8/12/2019 lcs_new

    30/34

    Remember that

    7/15/2014 30

    otherwise]),1[],1,[max(

    ],[][if1]1,1[],[

    jicjic

    jyixjicjic

    So we can start from c[m,n]and go backwards

    Whenever c[i,j] = c[i-1, j-1]+1, remember

    x[i] (becausex[i]is a part of LCS)

    When i=0 or j=0 (i.e. we reached the

    beginning), output remembered letters in

    reverse order

  • 8/12/2019 lcs_new

    31/34

    7/15/2014 31

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    1000 1

    1 21 1

    1 1 2

    1

    22

    1 1 2 2 3B

  • 8/12/2019 lcs_new

    32/34

    7/15/2014 32

    j 0 1 2 3 4 5

    0

    1

    2

    3

    4

    i

    Xi

    A

    B

    C

    Yj BB ACD

    0

    0

    00000

    0

    0

    0

    1000 1

    1 21 1

    1 1 2

    1

    22

    1 1 2 2 3B

    B C BLCS (reversed order):

    LCS (straight order): B C B

    (this string turned out to be a palindrome)

  • 8/12/2019 lcs_new

    33/34

    7/15/2014 33

    Given some items, pack the knapsack to getthe maximum total value. Each item has some

    weight and some value. Total weight that we can

    carry is no more than some fixed number W.So we must consider weights of items as well as

    their value.

    Item # Weight Value

    1 1 8

    2 3 6

    3 5 5

  • 8/12/2019 lcs_new

    34/34

    There are two versions of the problem:(1) 0-1 knapsack problem and

    (2) Fractional knapsack problem

    (1) Items are indivisible; you either take an item

    or not. Solved with dynamic programming

    (2) Items are divisible: you can take any fraction

    of an item. Solved with agreedy algorithm.