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]
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]
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)