Python

[Python] LCS-LENGTH Top-down Memoization

체봄 2020. 11. 19. 00:00
import time
import random
import string


def random_input(n):    # Random input
    rand_str = ""
    for i in range(n):  # n개의 문자 생성
        rand_str += str(random.choice(string.ascii_uppercase)) # 랜덤한 대문자 문자열 생성
    return rand_str

def MAX(num1, num2):    # 더 큰 값 반환
    if num1 > num2:
        return num1
    else:
        return num2

def LCS_LENGTH(X, Y, i, j):     # LCS의 길이를 구하는 함수
    if c[i][j] != -1:
        return c[i][j]
    else:
        if X[i-1] == Y[j-1]:
            c[i][j] = LCS_LENGTH(X, Y, i-1, j-1) + 1
        else:
            c[i][j] = MAX(LCS_LENGTH(X,Y,i,j-1), LCS_LENGTH(X,Y,i-1,j))

        return c[i][j]


n= 50
    
# random sequence 생성
X = random_input(n)
Y = random_input(n)

# 0번째 row 또는 col에서는 배열 값이 0, 그 외에는 배열 값이 -1
c = [[-1 for col in range(n+1)] for row in range(n+1)]
for row in range(n+1):
    c[row][0] = 0
for col in range(n+1):
    c[0][col] = 0

LCS_LENGTH(X, Y, n, n)  # X와 Y 사이의 LCS의 길이를 구함

print("Length of LCS : ", c[n][n])  # LCS의 길이 출력

random sequence X, Y

length of X,Y : n

running time : O(n^2)

반응형