레벤슈타인 거리 단계별 추적 소스코드

IT 위키
AlanTuring (토론 | 기여)님의 2025년 5월 8일 (목) 13:36 판 (새 문서: * 상위 문서: 레벤슈타인 거리 == 소스 코드 (python) == <syntaxhighlight lang="python3"> def print_matrix(matrix, X, Y): print(" " + " ".join(" " + c for c in Y)) for i, row in enumerate(matrix): prefix = " " if i == 0 else X[i - 1] print(prefix + " " + " ".join(f"{cell:2}" for cell in row)) print("\n") def edit_distance(X, Y): m, n = len(X), len(Y) dp = [[0] * (n + 1) for _ in range(m + 1)] # 초기화 for...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

소스 코드 (python)[편집 | 원본 편집]

def print_matrix(matrix, X, Y):
    print("     " + "  ".join(" " + c for c in Y))
    for i, row in enumerate(matrix):
        prefix = " " if i == 0 else X[i - 1]
        print(prefix + "  " + "  ".join(f"{cell:2}" for cell in row))
    print("\n")


def edit_distance(X, Y):
    m, n = len(X), len(Y)
    dp = [[0] * (n + 1) for _ in range(m + 1)]

    # 초기화
    for i in range(m + 1):
        dp[i][0] = i
    for j in range(n + 1):
        dp[0][j] = j

    print("초기 상태:")
    print_matrix(dp, X, Y)

    # DP 테이블 채우기
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if X[i - 1] == Y[j - 1]:
                dp[i][j] = dp[i - 1][j - 1]  # 문자가 같으면 비용 없음
            else:
                dp[i][j] = 1 + min(
                    dp[i - 1][j],    # 삭제
                    dp[i][j - 1],    # 삽입
                    dp[i - 1][j - 1] # 교체
                )
        print(f"X[0:{i}] = '{X[:i]}' 까지 고려한 상태:")
        print_matrix(dp, X, Y)

    print("최종 편집 거리:", dp[m][n])
    return dp[m][n]

# 테스트
edit_distance("lengthen", "elongate")

결과 예시[편집 | 원본 편집]

초기 상태:
      e   l   o   n   g   a   t   e
    0   1   2   3   4   5   6   7   8
l   1   0   0   0   0   0   0   0   0
e   2   0   0   0   0   0   0   0   0
n   3   0   0   0   0   0   0   0   0
g   4   0   0   0   0   0   0   0   0
t   5   0   0   0   0   0   0   0   0
h   6   0   0   0   0   0   0   0   0
e   7   0   0   0   0   0   0   0   0
n   8   0   0   0   0   0   0   0   0


X[0:1] = 'l' 까지 고려한 상태:
      e   l   o   n   g   a   t   e
    0   1   2   3   4   5   6   7   8
l   1   1   1   2   3   4   5   6   7
e   2   0   0   0   0   0   0   0   0
n   3   0   0   0   0   0   0   0   0
g   4   0   0   0   0   0   0   0   0
t   5   0   0   0   0   0   0   0   0
h   6   0   0   0   0   0   0   0   0
e   7   0   0   0   0   0   0   0   0
n   8   0   0   0   0   0   0   0   0


X[0:2] = 'le' 까지 고려한 상태:
      e   l   o   n   g   a   t   e
    0   1   2   3   4   5   6   7   8
l   1   1   1   2   3   4   5   6   7
e   2   1   2   2   3   4   5   6   6
n   3   0   0   0   0   0   0   0   0
g   4   0   0   0   0   0   0   0   0
t   5   0   0   0   0   0   0   0   0
h   6   0   0   0   0   0   0   0   0
e   7   0   0   0   0   0   0   0   0
n   8   0   0   0   0   0   0   0   0


X[0:3] = 'len' 까지 고려한 상태:
      e   l   o   n   g   a   t   e
    0   1   2   3   4   5   6   7   8
l   1   1   1   2   3   4   5   6   7
e   2   1   2   2   3   4   5   6   6
n   3   2   2   3   2   3   4   5   6
g   4   0   0   0   0   0   0   0   0
t   5   0   0   0   0   0   0   0   0
h   6   0   0   0   0   0   0   0   0
e   7   0   0   0   0   0   0   0   0
n   8   0   0   0   0   0   0   0   0


X[0:4] = 'leng' 까지 고려한 상태:
      e   l   o   n   g   a   t   e
    0   1   2   3   4   5   6   7   8
l   1   1   1   2   3   4   5   6   7
e   2   1   2   2   3   4   5   6   6
n   3   2   2   3   2   3   4   5   6
g   4   3   3   3   3   2   3   4   5
t   5   0   0   0   0   0   0   0   0
h   6   0   0   0   0   0   0   0   0
e   7   0   0   0   0   0   0   0   0
n   8   0   0   0   0   0   0   0   0


X[0:5] = 'lengt' 까지 고려한 상태:
      e   l   o   n   g   a   t   e
    0   1   2   3   4   5   6   7   8
l   1   1   1   2   3   4   5   6   7
e   2   1   2   2   3   4   5   6   6
n   3   2   2   3   2   3   4   5   6
g   4   3   3   3   3   2   3   4   5
t   5   4   4   4   4   3   3   3   4
h   6   0   0   0   0   0   0   0   0
e   7   0   0   0   0   0   0   0   0
n   8   0   0   0   0   0   0   0   0


X[0:6] = 'length' 까지 고려한 상태:
      e   l   o   n   g   a   t   e
    0   1   2   3   4   5   6   7   8
l   1   1   1   2   3   4   5   6   7
e   2   1   2   2   3   4   5   6   6
n   3   2   2   3   2   3   4   5   6
g   4   3   3   3   3   2   3   4   5
t   5   4   4   4   4   3   3   3   4
h   6   5   5   5   5   4   4   4   4
e   7   0   0   0   0   0   0   0   0
n   8   0   0   0   0   0   0   0   0


X[0:7] = 'lengthe' 까지 고려한 상태:
      e   l   o   n   g   a   t   e
    0   1   2   3   4   5   6   7   8
l   1   1   1   2   3   4   5   6   7
e   2   1   2   2   3   4   5   6   6
n   3   2   2   3   2   3   4   5   6
g   4   3   3   3   3   2   3   4   5
t   5   4   4   4   4   3   3   3   4
h   6   5   5   5   5   4   4   4   4
e   7   6   6   6   6   5   5   5   4
n   8   0   0   0   0   0   0   0   0


X[0:8] = 'lengthen' 까지 고려한 상태:
      e   l   o   n   g   a   t   e
    0   1   2   3   4   5   6   7   8
l   1   1   1   2   3   4   5   6   7
e   2   1   2   2   3   4   5   6   6
n   3   2   2   3   2   3   4   5   6
g   4   3   3   3   3   2   3   4   5
t   5   4   4   4   4   3   3   3   4
h   6   5   5   5   5   4   4   4   4
e   7   6   6   6   6   5   5   5   4
n   8   7   7   7   6   6   6   6   5


최종 편집 거리: 5