Upload
codingclub
View
137
Download
4
Embed Size (px)
Citation preview
2016.12.03
4 주차
LCS
(Longest Common Sub-sequence)
LCS 알고리즘• LCS:Longest Common Subsequence“ 최장 공통 부문 문자열 :
cf) substring: 연속된 부분 문자열 subsequence: 연속적이지 않은 부분 문자열ex) Iamhungry 에서 substring: hung ( 연속된 부분 문자열 ) subsequence: augy ( 연속적으로 이어지진 않지만 순서는 맞음 )
LCS 알고리즘• 특징LCS 알고리즘은 두 열 S1 과 S2 가 주어졌을 때 , 두 열에 공통으로 들어있는 부분열 중에서 가장 긴 열의 길이를 찾아낸다 .Dynamic programming
* 부분열 : 다른 문자열에서 몇몇 문자가 빠져있어도 순서는 바뀌지 않는 문자열• 쓰임 : DNA 유사성 판별
LCS 알고리즘• Dynamic programming복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법문제를 여러 하위 문제로 나눠 푼 다음 , 그 결과를 이용하여 결합해 문제를 해결한다 . 즉 원하는 결과를 구하기 위해 먼저 계산한 값을 이용한다 (Memoization).
cf) 피보나치 수열
LCS 알고리즘• Dynamic programming*Memoization
LCS 알고리즘• Dynamic programming*Memoization3 이 두 번 중복되어서 호출 중복되는 부분을 없애주는 것이 Memoization이미 계산한 건 배열에 저장해 두고 다음에 다시 계산할 때그것을 다시 이용한다 .함수형 프로그래밍에서는 계산 결과를 캐시해두는 방식이다
LCS 알고리즘• Dynamic programming*Memoization 실행 후 , 회색 부분은 계산할 필요가 없어짐
LCS 알고리즘• 예시
LCS 의 작동 과정S1 : “THESTRINGS”S2 : “THISISIT”반환 값 : 5공통 부분열을 찾을 때 S1 중간의 E 와 S2 중간의 I 는 무시됨S2 마지막 IT 는 S1 의 마지막 S 뒤에 I 가 없어서 비교할 수 없다 .
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
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';• }• }• }
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;}