Example #1
0
def back_spaceeff_dyna(x, y, c):
    """
    Find the LCS_length end value with a linear space backward algorithm
    """
    n = len(y)
    m = len(x)
    for i in range(m - 1, -1, -1):
        c[n][1] = 0
        for j in range(n - 1, -1, -1):
            if x[i] == y[j]:
                c[j][1] = c[j + 1][0] + 1
            else:
                cbottom = c[j][0]
                cright = c[j + 1][1]
                cbottomright = c[j + 1][0]

                c[j][1], d = max3(cbottomright, cbottom, cright)
        for k in range(len(c)):
            c[k][0] = c[k][1]
Example #2
0
def spaceeff_dyna(x, y, c):
    """
    Find the LCS_length end value with a linear space forward algorithm
    """
    n = len(y)
    m = len(x)
    for i in range(1, m + 1):
        c[0][1] = 0
        for j in range(1, n + 1):
            if x[i - 1] == y[j - 1]:
                c[j][1] = c[j - 1][0] + 1
            else:
                ctop = c[j][0]
                cleft = c[j - 1][1]
                ctopleft = c[j - 1][0]

                c[j][1], d = max3(ctopleft, ctop, cleft)
        for k in range(len(c)):
            c[k][0] = c[k][1]
Example #3
0
def approximated_dp_ed(x, y, k, ed):
    """
    Compute the ED with an approximated divide and conquer LCS algorithm
    """
    if not (k < len(x) and k < len(y)) or k < 1:
        raise Exception('BAD K')

    m = len(x)
    n = len(y)
    c = [[0 for _ in range(n + 1)] for _ in range(m + 1)]
    b = [[0 for _ in range(n)] for _ in range(m)]

    diff = m - n

    left = -k // 2
    right = k // 2 + k % 2

    if diff > 0:  # m > n -> x longer than y
        left -= diff
    else:  # m > n -> y longer than x
        right += -diff  # (-) because diff < 0

    # building b and c
    for i in range(m):
        for j in range(max(1, left), min(n, right)):
            if x[i] == y[j]:
                c[i + 1][j + 1] = c[i][j] + 1
                b[i][j] = 0  # TOPLEFT
            else:
                ctop = c[i][j + 1]
                cleft = c[i + 1][j]
                ctopleft = c[i][j]

                c[i + 1][j + 1], b[i][j] = max3(ctopleft, ctop, cleft)

        left += 1
        right += 1

    # building answer

    i = m - 1
    j = n - 1

    while i >= 0 and j >= 0:
        ed.add_marker(i, j)
        if b[i][j] == 0:  # TOPLEFT
            i -= 1
            j -= 1
        elif b[i][j] == 1:  # TOP
            i -= 1
        else:
            j -= 1

    while i >= 0 or j >= 0:
        if i >= 0:
            ed.add_marker(i, j)
            i -= 1
        if j >= 0:
            ed.add_marker(i, j)
            j -= 1

    ed.add_marker(i, j)