12
2016.12.03 4 주주 LCS (Longest Common Subsequence)

[알고리즘 스터디 4주차]LCS 알고리즘

Embed Size (px)

Citation preview

Page 1: [알고리즘 스터디 4주차]LCS 알고리즘

2016.12.03

4 주차

LCS

(Longest Common Sub-sequence)

Page 2: [알고리즘 스터디 4주차]LCS 알고리즘

LCS 알고리즘• LCS:Longest Common Subsequence“ 최장 공통 부문 문자열 :

cf) substring: 연속된 부분 문자열 subsequence: 연속적이지 않은 부분 문자열ex) Iamhungry 에서 substring: hung ( 연속된 부분 문자열 ) subsequence: augy ( 연속적으로 이어지진 않지만 순서는 맞음 )

Page 3: [알고리즘 스터디 4주차]LCS 알고리즘

LCS 알고리즘• 특징LCS 알고리즘은 두 열 S1 과 S2 가 주어졌을 때 , 두 열에 공통으로 들어있는 부분열 중에서 가장 긴 열의 길이를 찾아낸다 .Dynamic programming

* 부분열 : 다른 문자열에서 몇몇 문자가 빠져있어도 순서는 바뀌지 않는 문자열• 쓰임 : DNA 유사성 판별

Page 4: [알고리즘 스터디 4주차]LCS 알고리즘

LCS 알고리즘• Dynamic programming복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법문제를 여러 하위 문제로 나눠 푼 다음 , 그 결과를 이용하여 결합해 문제를 해결한다 . 즉 원하는 결과를 구하기 위해 먼저 계산한 값을 이용한다 (Memoization).

cf) 피보나치 수열

Page 5: [알고리즘 스터디 4주차]LCS 알고리즘

LCS 알고리즘• Dynamic programming*Memoization

Page 6: [알고리즘 스터디 4주차]LCS 알고리즘

LCS 알고리즘• Dynamic programming*Memoization3 이 두 번 중복되어서 호출 중복되는 부분을 없애주는 것이 Memoization이미 계산한 건 배열에 저장해 두고 다음에 다시 계산할 때그것을 다시 이용한다 .함수형 프로그래밍에서는 계산 결과를 캐시해두는 방식이다

Page 7: [알고리즘 스터디 4주차]LCS 알고리즘

LCS 알고리즘• Dynamic programming*Memoization 실행 후 , 회색 부분은 계산할 필요가 없어짐

Page 8: [알고리즘 스터디 4주차]LCS 알고리즘

LCS 알고리즘• 예시

LCS 의 작동 과정S1 : “THESTRINGS”S2 : “THISISIT”반환 값 : 5공통 부분열을 찾을 때 S1 중간의 E 와 S2 중간의 I 는 무시됨S2 마지막 IT 는 S1 의 마지막 S 뒤에 I 가 없어서 비교할 수 없다 .

Page 9: [알고리즘 스터디 4주차]LCS 알고리즘

LCS 알고리즘

Page 10: [알고리즘 스터디 4주차]LCS 알고리즘

LCS 알고리즘 in C code• #include<stdio.h>• #include<string.h>•  • int i,j,m,n,c[20][20]; void lcs()• {•                 m=strlen(x);•                 n=strlen(y);•                 for(i=0;i<=m;i++)•                                 c[i][0]=0;•                 for(i=0;i<=n;i++)•                                 c[0][i]=0;•                                 •                 //c, u and l denotes cross, upward and downward direc-

tions respectively

Page 11: [알고리즘 스터디 4주차]LCS 알고리즘

LCS 알고리즘 in C code•                 for(i=1;i<=m;i++)•                                 for(j=1;j<=n;j++)•                                 {•                                                 if(x[i-1]==y[j-1])•                                                 {•                                                                 c[i][j]=c[i-1][j-1]+1;•                                                                 b[i][j]='c';•                                                 }•                                                 else if(c[i-1][j]>=c[i][j-1])•                                                 {•                                                                 c[i][j]=c[i-1][j];•                                                                 b[i][j]='u';•                                                 }•                                                 else•                                                 {•                                                                 c[i][j]=c[i][j-1];•                                                                 b[i][j]='l';•                                                 }•                                 }• }

Page 12: [알고리즘 스터디 4주차]LCS 알고리즘

LCS 알고리즘 in C code• int main()• {•                 printf("Enter 1st se-

quence:");•                 scanf("%s",x);•                 printf("Enter 2nd se-

quence:");•                 scanf("%s",y);•                 printf("\nThe Longest

Common Subsequence is ");•                 lcs();•                 print(m,n);

• char x[20],y[20],b[20][20];•  

void print(int i,int j){                if(i==0 || j==0)                                return;                if(b[i][j]=='c')                {                                print(i-1,j-1);                                printf("%c",x[i-1]);                }                else if(b[i][j]=='u')                                print(i-1,j);                else                                print(i,j-1);}         return 0;}