[Dynamic Programming] 근사 문자열 매칭과 거리 함수 & LCS

2024. 12. 9. 02:05·CS/Algorithm
728x90
반응형

근사 문자열 매칭 (approximate string matching)

  • 비슷한 문자열 비교
  • 주어진 문자열과 비슷한 문자열을 검색 ex) 검색 엔진 유사어 추천 등..

비슷한 것이라는 것은 무엇인가?

이때 사용하는 것이 거리함수이다.

 

거리 함수

  • 해밍거리 (Hamming distance) : 단순 문자열 매칭으로 다른 자리의 갯수 - 글자가 끼어들거나 빠지거나 할 수 없는 경우 사용할 수 있음 
  • 편집거리 (edit distance) : 첫번째 문자열을 두번째 문자열로 바꾸는데 얼마나 많은 editing 작업을 해야하는가? 
  • 가중편집거리 (weighted edit distance) 

 

편집 거리

한 문자열을 다른 문자열로 변경하기 위해 필요한 편집 연산 (edit operation)들의 최소 수

 

편집 연산

  • 삽입 (Insertion)
  • 삭제 (Deletion)
  • 교체 (Substitution or Replacement)

 

DP를 이용한 편집 거리 계산

두 문자열 S1과 S2에 대해, D(i,j)는 S1[1...i]과 S2[1...j]에 대한 편집거리를 나타냄

  • S1, S2의 길이가 각각 n, m일 때, S1과 S2의 편집거리는 D(n,m)
  • D(n,m)을 계산하기 위해 각 i와 j에 대해 D(i,j)를 계산함

 

DP 요소

  • Recurrence relation
  • Tabular computation
  • Traceback

 

Recurrence Relation

match, change, insert, delete를 어떻게 조합하는지에 따라서 다양한 편집거리가 나올 수 있다

제일 좋은 operation 이 있을 것이다.

 

위에서부터 insert, delete, match/change이다.

 

마지막이 insert인 경우

insert하는 것을 제외하고 생각하면, i와 j-1까지의 편집거리를 알아야한다.

insert는 비용이 있기 때문에 +1 한다.

 

마지막이 delete인 경우

위에 delete하는 것을 제외하고 i-1과 j까지의 편집 거리를 알아야한다.

delete는 비용이 있기 때문에 +1 한다.

 

마지막 식은 마지막을 제외한 부분만 해서 비교한다.

t(i,j)가 같으면 0이고, 다르면 이전 부분에서 +1 해서 change를 의미한다.

 

Tabular Computation

배열 형태로 보면, 위 왼쪽 대각선 세 방향에서 오는 것이라는 것을 할 수 있다.

대각선으로 오면 같으면 0, 다르면 +1이고 위나 왼쪽에서는 무조건 +1이다

 

Traceback

 

최장 공통 부분 서열 (LCS)

두 개의 DNA 순서열 (sequence)이 있을 때, 이 두개가 얼마나 유사한지를 측정하는 일이 자주 발생한다. 

edit distance와 매우 비슷한 문제이다

-> match의 개수가 가장 많은 것이 LCS이다.

 

LCS 최적화 재귀식

DP로 해결하기 위해서

 

모든 i에 대해 x의 prefix를 Xi = (x1, x2, .... xi), Yi = (y1, y2, ... yi)로 정의한다. 

Z = (z1, ... zk)를 X, Y의 LCS라고 하자

 

If Xm = Yn, then zk = xm = yn and \(Z_{k-1}\) is an LCS of \(X_{m-1} \)and \(Y_{n-1}\)

마지막이 같으면 LCS에 마지막 글자를 붙인다

If Xm != Yn, then zk != xm implies that Z is an LCS of \(X_{m-1}\) and \(Y_n\)

If Xm != Xn, then zk != ym implies that Z is an LCS of \(Y_{n-1}\) and \(X_m\)

마지막이 다르면, 둘 중 더 좋은 것을 선택하여 LCS로 설정한다.

 

LCS(i, j) = 0 (if i = 0 or j = 0)

LCS(i,j) = LCS(i -1, j -1) + 1 (if xi = yi)

LCS(i,j) = max[LCS(i,j-1), LCS(i-1,j)} (if xi != yi)

 

얘는 "칸"이 아니라 배열의 "교차점"이라고 생각하면 좋음

shortest path와도 비슷하다. 결국, 맨 왼쪽 위에서 오른쪽 아래로 가는 빠른 길로 가는 방법이다

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'CS > Algorithm' 카테고리의 다른 글

[Dynamic Programming] 문제 모음  (0) 2024.12.09
[Dynamic Programming] Sequence Alignment & 최대 공백 정사각형  (0) 2024.12.09
[Dynamic Programming] Working Days & Path Counting & Matrix Chain Multiplication  (0) 2024.12.09
[Dynamic Programming] Maximum Subarray & Floyd Warshall Alg  (0) 2024.12.09
[ Divide and Conquer ] Matrix Multiplication & Karatsuba Algorithm  (0) 2024.12.05
'CS/Algorithm' 카테고리의 다른 글
  • [Dynamic Programming] 문제 모음
  • [Dynamic Programming] Sequence Alignment & 최대 공백 정사각형
  • [Dynamic Programming] Working Days & Path Counting & Matrix Chain Multiplication
  • [Dynamic Programming] Maximum Subarray & Floyd Warshall Alg
min_zu
min_zu
  • min_zu
    민주제도
    min_zu
  • 전체
    오늘
    어제
    • ._. (176)
      • AI (2)
        • DeepLearning (2)
        • CS231n (0)
      • Web (2)
        • ReactJS (0)
      • CS (83)
        • OS (7)
        • Data Structure (23)
        • Computer Architecture (8)
        • Computer Network (20)
        • Algorithm (25)
      • Linux (3)
        • KaliLinux (0)
        • Docker (1)
      • Hacking (83)
        • Write Up (25)
        • Pwnable (13)
        • Reversing (2)
        • Cryptography (12)
        • Web Hacking (4)
        • Window (6)
        • Network (7)
        • Web3 (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    WinAFL
    Web
    DataStructure
    Search
    Sort
    OS
    UTM
    Mac
    Linux
    DeepLearning
    Graph
    ComputerArchitecture
    Tree
    AI
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
min_zu
[Dynamic Programming] 근사 문자열 매칭과 거리 함수 & LCS
상단으로

티스토리툴바