5.3 Edit Distance
삽입(insert), 삭제(delete), 대체(substitute) 연산을 사용하여 문자열 S를 수정하여 다른 문자열 T로 변환하고자 할 때 필요한 최소의 편집 연산 횟수
1. 'strong' → 'stone'
- 위에서는 's'와 't'는 그대로 사용하고, 'o'를 삽입하고, 'r'과 'o'를 각각 삭제
- 그리고 'n'을 그대로 사용하고, 마지막으로 'g'를 'e'로 대체하여, 총 4회의 편집 연산 수행
없는 글자 삭제는 필수, 대체는 삭제 + 삽입보다 비용이 저렴하다.
2. 'strong' → 'stone'
- 's'와 't'는 그대로 사용한 후, 'r'을 삭제하고, 'o'와 'n'을 그대로 사용한 후, 'g'를 'e'로 대체하여, 총 2회의 편집 연산만이 수행되고, 이는 최소 편집 횟수이다.
S를 T로 바꾸는데 어떤 연산을 어느 문자에 수행하는가에 따라서 편집 연산 횟수가 달라진다.
5.3.1 Subproblem Definition
Prefix
- 'strong' → 'stone'
- stro를 sto로 바꾸는 편집 거리를 미리 알면, ng를 ne로 바꾸는 편집 거리를 찾음으로써 주어진 입력에 대한 편집 거리를 구할 수 있다.
편집 거리 알고리즘은 "부분 문제"를 점화식으로 쪼개서 푸는데 두 문자열의 각각 모든 접두부 조합에 대해 "최소 편집 거리"를 미리 구해 놓으면 전체를 쉽게 해결할 수 있다.
Subproblem Definition
∣S∣=m,∣T∣=n
S=s1s2s3s4⋯sm
T=t1t2t3t4⋯tn
- E[i,j]= S의 처음 i개 문자를 T의 처음 j개 문자로 바꾸는데 필요한 편집 거리
- 'strong' → 'stone'에 대해서, stro를 sto로 바꾸기 위한 편집 거리는 E[4,3]이다.
최대로 중복되는 문자(substring)를 찾는 것이 편집 거리 문제이다.
E[6, 5]는 E[4, 3], 즉 substring에서부터 파생된다.
5.3.2 'strong' → 'stone'에 대해
s1→t1
- ['s' → 's']
- s1=t1= 's'이므로 E[1,1]=0
s1→t1t2
- ['s' → 'st']
- s1=t1='s'이고, 't'를 삽입하므로 E[1,2]=1
s1s2→t1
- ['st' → 's']
- s1=t1='s'이고, 't'를 삭제하여 E[2,1]=1
s1s2→t1t2
- ['st' → 'st']
- s1=t1='s'이고, s2=t2='t'이므로 E[2,2]=0
- 이 경우에는 E[1,1]=0이라는 결과를 이용하고, s2=t2='t'이므로, E[2,2]=E[1,1]+0=0
5.3.3 E[i, j]
E[4,3] 계산 방법
- s1s2s3s4→t1t2
- E[4, 2]의 해를 알면, t3= 'o'를 삽입하면 E[4, 2] + 1
- E[3, 3]의 해를 알면, s4= 'o'를 삭제하면 E[3, 3] + 1
- E[3, 2]의 해를 알면, s4= 'o'과 t3= 'o'이 같으므로 E[3, 2] + 0
Generalization: E[i, j]
E[i,j]=min{E[i,j−1]+1,E[i−1,j]+1,E[i−1,j−1]+α}
단,α={10if si=tjif si=tj
Initialization
- 0번 행의 0 ~ n 초기화 의미
- S의 첫 문자를 처리하기 전에 즉, S가 ϵ(공 문자열)인 상태에서 T의 문자를 좌에서 우로 하나씩 만들어 가는데 필요한 삽입 연산 횟수를 각각 나타낸다.
- 0번 열의 0 ~ m 초기화 의미
- T를 ϵ로 만들기 위해서, S의 문자를 위에서 아래로 하나씩 없애는데 필요한 삭제 연산 횟수를 각각 나타낸다.
EditDistance
- Input: S, T(각 문자열의 길이는 각각 m과 n이다.)
- Output: S를 T로 변환하는 편집 거리, E[m,n]
- for i=0 to m; E[i,0] = i // 0번 열 초기화
- for j=0 to n; E[0,j] = j // 0번 행 초기화
- for i=1 to m // 각 행에 대해서
- for j=1 to n // 각 열에 대해서
- E[i, j] = min{E[i, j-1] + 1, E[i-1, j] + 1, E[i-1, j-1] + α}
- return E[m, n]
5.3.4 Procedure
'strong' → 'stone'의 편집 거리
E[1, 1]
- E[1, 1] = min{E[1, 0] + 1, E[0, 1] + 1, E[0, 0] + α}
- S와 T가 같은 경우에는 α가 0이다.
E[2, 2]
- E[2, 2] = min{E[2, 1] + 1, E[1, 2] + 1, E[1, 1] + α}
E[3, 2]
- E[3, 2] = min{E[3, 1] + 1, E[2, 3] + 1, E[2, 2] + α}
E[4, 3]
- E[4, 3] = min{E[4, 2] + 1, E[3, 3] + 1, E[3, 2] + α}
E[5, 4]
- E[5, 4] = min{E[5, 3] + 1, E[4, 4] + 1, E[4, 3] + α}
E[6, 5]
- E[6, 5] = min{E[6, 4] + 1, E[5, 5] + 1, E[5, 4] + α}
5.3.5 Time Complexity
- 시간 복잡도는 O(mn)
- 총 부분 문제의 수가 배열 E의 원소 수인 mxn이고, 각 부분 문제를 계산하기 위해 주위의 3개의 부분 문제들의 해를 참조한 후, 최솟값을 찾는 것이므로 O(1) 시간 소요
5.3.6 Application
- 생물 정보 공학 및 의학 분야
- 편집 거리가 작으면 문자열들이 서로 유사하다고 판단할 수 있으므로 두 개의 유전자가 얼마나 유사한가 측정하는데 활용
- 환자의 유전자 속에서 암 유전자와 유사한 유전자를 찾아 미리 진단
- 암세포에만 있는 특징을 분석하여 항암제 개발
- 좋은 형질을 가진 유전자들 탐색
- 철자 오류 검색
- 광학 문자 인식에서의 보정 시스템
- 자연어 번역