Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
알고리즘 4장-스트링 매칭 2/34
동명대학교 멀티미디어공학과
스트링 매칭
주어진 텍스트에서 주어진 패턴이 어디에 나타나는지를 알아내는 문제– 알파벳 Σ– 텍스트 T[0..n-1]
– 패턴 P[0..m-1]
공 스트링 ε스트링 접속 xy
x=wy
– w: x의 접두부. w x
– y: x의 접미부. y x
알고리즘 4장-스트링 매칭 3/34
동명대학교 멀티미디어공학과
직선적 알고리즘
텍스트의 각 위치에서 시작하는 부분 스트링이패턴과 일치하는지를 조사
주어진 텍스트 T : a b a c a b a c a b a b a b b a c a a b b c …찾고자 하는 패턴 P : a b a b a b c a
알고리즘 4장-스트링 매칭 4/34
동명대학교 멀티미디어공학과
주어진 텍스트 T a b a c a b a c a b a b a b b a c a a b b c …찾고자 하는 패턴 P a b a b a b c a
a b a b a b c aa b a b a b c a
a b a b a b c aa b a b a b c a
:
:
직선적 패턴 매칭 알고리즘의 동작
알고리즘 4장-스트링 매칭 5/34
동명대학교 멀티미디어공학과
직선적-스트링-매칭 ( T, P, n, m )
//입력 : T : 텍스트, 크기가 n인 문자의 배열
//출력 : 패턴, 크기가 m인 문자의 배열
{
1 for (i = 0; i ≤ n-m; i++) {
2 for (j = 0; j < m; j++) {
3 if ( P[j] != T[i + j] ) break;
4 }
5 if (j == m) printf (“패턴이 텍스트의 i번째 문자부터 나타남”);
6 }
}
직선적 스트링 매칭 알고리즘
알고리즘 4장-스트링 매칭 6/34
동명대학교 멀티미디어공학과
직선적 스트링 매칭 분석
최악의 경우T: 0 0 0 0 0 ...... 0 0 0 0 0 1P: 0 0 0 0 1
O(m(n-m+1))=O(mn)
알고리즘 4장-스트링 매칭 7/34
동명대학교 멀티미디어공학과
라빈-카프 알고리즘
최악의 시간복잡도는 여전히 O(mn)이지만 평균적으로는 훨씬 빠른 알고리즘
스트링을 숫자 값으로 바꾸어, 즉 hash 값을계산하여 매칭하는 알고리즘
알고리즘 4장-스트링 매칭 8/34
동명대학교 멀티미디어공학과
간단한 예
Σ = {0, 1, … , 9}
T: 25436712345678P: 1234– 패턴과 텍스트의 각 원소는 각각의 숫자 코드일 것
이지만 패턴 전체를 하나의 십진수로 바꾸어 생각한다.
– P를 한 워드로 나타낼 수 있다면 n-m+1번의 비교로 매칭 가능
알고리즘 4장-스트링 매칭 9/34
동명대학교 멀티미디어공학과
십진수 계산
P[0..m-1]에 대한 십진수 p 계산 – Horner
의 방법 적용
P = P[0]10m-1+P[1]10m-2+…+P[m-1]100
= P[m-1]+10(P[m-2]+10(P[m-3] +…+10(P[1]+10P[0])…))
O(m) 시간 복잡도
알고리즘 4장-스트링 매칭 10/34
동명대학교 멀티미디어공학과
십진수 계산
T[0..n-1]에 대한 계산
t0 =T[0]10m-1+T[1]10m-2+ … +T[m-1]100
][])[10(10
10][...10]2[10]1[
10]1[...10]1[10][
1
0211
021
msTsTt
msTsTsTt
msTsTsTt
ms
mms
mms
++−=
++++++=
−+++++=
−
−−+
−−
O(n) 시간 복잡도
알고리즘 4장-스트링 매칭 11/34
동명대학교 멀티미디어공학과
일반적인 알파벳
|Σ |=d → Σ = {0,1, …, d-1}로 간주 d진법수로변환
패턴 변환
P = P[0]dm-1+P[1]dm-2+…+P[m-1]d0
= P[m-1]+d(P[m-2]+d(P[m-3] +…+d(P[1]+dP[0])…))
알고리즘 4장-스트링 매칭 12/34
동명대학교 멀티미디어공학과
일반적인 알파벳
텍스트 변환
][])[(
]1[...]1[]0[1
1
0210
msTsTdtdt
dmsTdsTdTtm
ss
mm
++−=
−+++++=−
+
−−
qmsTsTdd
qtqph
mss mod])[])[((
modmod
11
00
++−=
==
−+ ττ
τ
q는 d*q가 한 워드로 되는 최대 소수
알고리즘 4장-스트링 매칭 13/34
동명대학교 멀티미디어공학과
mod 연산의 성질
qqbqaqba mod))mod()mod((mod)( ⋅=⋅
qmsTDsTdqdD
ss
m
mod])[)][((mod
1
1
++−==
+
−
ττ
알고리즘 4장-스트링 매칭 14/34
동명대학교 멀티미디어공학과
라빈-카프-매칭 ( T, P, d, q ) {// 입력 : T : 텍스트, 크기가 n인 문자의 배열 T[0..n-1]// P : 패턴, 크기가 m인 문자의 배열 P[0..m-1]// d : 알파벳의 크기
// q : 해시 함수에 의해 결정되는 값. 통상 소수를 택함
1 D = dm-1 mod q;2 h = 0; t = 0;3 for (i = 0; i ≤ m- 1; i++) {4 h = (d * h + P[i]) mod q;5 t = (d * h + T[i]) mod q;6 }7 for (s = 0; s < n- m+1; s++) {8 if ( h == t ) {9 for ( i = 0; i < m; i++)10 if (P[i] != T[s+i]) break;11 if (i == m) printf (“패턴이 위치 s에서 발생”)12 }13 if (s < n-m) t = (d * (t – T[s] * D) + (T[s + m]) mod q;14 }
}라빈-카프 매칭 알고리즘
알고리즘 4장-스트링 매칭 15/34
동명대학교 멀티미디어공학과
라빈-카프 알고리즘의 분석
패턴의 해시값과 텍스트의 해시 값이 일치하는경우 다시 일일이 문자 비교를 해야 하기 때문에 최악의 실행시간은 O(mn)
P=am, T=an
패턴의 해시값과 텍스트의 해시값이 모두 불일치하는 최선의 경우 O(m+n)시간
실제로 대부분의 경우 해시값이 불일치하는 경우가 많을 것이며 따라서 O(m+n)시간에 실행될 가능성이 높음
알고리즘 4장-스트링 매칭 16/34
동명대학교 멀티미디어공학과
KMP 알고리즘
Knuth, Morris, Pratt 세 사람이 고안
패턴을 전처리(preprocessing)하여 접미부와일치하는 최대 접두부를 구하고 이 정보를 이용하여 매칭하는 방법
O(n+m)시간 알고리즘
알고리즘 4장-스트링 매칭 17/34
동명대학교 멀티미디어공학과
T : a b a b a b a c a b a b a b c a c a a b b cP : a b a b a b c a
T : a b a b a b a c a b a b a b c a c a a b b cP : a b a b a b c a
T : a b a b a b a c a b a b a b c a c a a b b cP : a b a b a b c a
T : a b a b a b a c a b a b a b c a c a a b b cP : a b a b a b c a
알고리즘 4장-스트링 매칭 18/34
동명대학교 멀티미디어공학과
T : a b a b a b a c a b a b a b c a c a a b b c
P : a b a b a b c a
T : a b a b a b a c a b a b a b c a c a a b b c
P : a b a b a b c a
패턴 일치가 발생할 수 있는 두 경우
알고리즘 4장-스트링 매칭 19/34
동명대학교 멀티미디어공학과
a b a b a b c a
a b a b a b c a
(a)
a b a b a b c a
a b a b a b c a
(b)
접두부와 접미부의 일치
알고리즘 4장-스트링 매칭 20/34
동명대학교 멀티미디어공학과
T : a b a b a b a c a b a b a b c a c a a b b c
P : a b a b a b c a
a b a b a b c a
a b a b a b c a
a b a b a b c a
a b a b a b c a
a b a b a b c a
KMP 방법의 비교 과정
알고리즘 4장-스트링 매칭 21/34
동명대학교 멀티미디어공학과
최대 접두부 테이블
패턴 P[0..,m-1]의 각 위치에 대하여 접미부와 일치하는 최대 접두부의 길이를 계산SP[i]=max {k : k<i and P[0..k]⊐ P[0..i]}
SP[i]까지를 구했다고 가정할 때,
SP[i+1]=?
– P[i+1]=P[SP[i]+1] → SP[i+1]=SP[i]+1
– P[i+1]≠P[SP[i]+1] → SP[i+1]≤SP[i]+1
알고리즘 4장-스트링 매칭 22/34
동명대학교 멀티미디어공학과
ComputeSP (P, SP, m) {//입력 : 패턴 P[0..m-1]
//출력 : 최대 접두부 테이블 SP[0..m-1]
1 SP[0] = -1;
2 k = -1;
3 for ( j = 1; j ≤ m-1; j++ ) {
4 while (k >= 0 && P[k+1] != P[j]) k = SP[k];
5 if (P[k+1] == P[ j ]) k++;
6 SP[ j ] = k;
7 }
}최대 접두부 계산 알고리즘
알고리즘 4장-스트링 매칭 23/34
동명대학교 멀티미디어공학과
i 0 1 2 3 4 5 6 7
P[ i ] a b a b a b c a
SP[ i ] -1 -1 0 1 2 3 -1 0
P = abababca에 대한 SP 테이블
abababcaabababca
abababcaabababca
abababcaabababca
abababcaabababca
abababcaabababca
abababcaabababca
abababcaabababca
알고리즘 4장-스트링 매칭 24/34
동명대학교 멀티미디어공학과
KMP매칭 (P, T, n, m) {// 입력 : 텍스트 T[0..n-1], 패턴 P[1..m-1]
// 출력 : 패턴이 발생하는 위치
1 ComputeSP (P, SP, m);
2 j = -1;
3 for (i = 0; i ≤ n-1; i++) {
4 while ( j ≥>=0 && P[ j+1 ] != T[i]) j = SP[ j ];
5 if (P[ j+1 ] == T[i]) j++;
6 if ( j == m-1) {
7 printf (“패턴이 T[i]에서 일치함”);
8 j = SP[ j ];
9 }
10 }
} KMP 매칭 알고리즘
알고리즘 4장-스트링 매칭 26/34
동명대학교 멀티미디어공학과
Boyer-Moore 알고리즘
좌에서 우로 패턴 매칭 위치를 탐색하지만 문자 비교는 우에서 좌로 행함.
일치 접미부 방책(good suffix heuristics)
불일치 문자 방책(bad character heuristics)
알고리즘 4장-스트링 매칭 27/34
동명대학교 멀티미디어공학과
불일치 문자 방책
P[i]와 T[j]의 문자 비교에서 불일치가 발생했다고 하자. 그리고 k가 T[j]=P[k]인 최대의 k라고 하자.
– k<i 일 때(k=-1, 즉 패턴에 그 문자가 없는 경우도포함) : P[k]가 T[j]에 정렬되도록 패턴을 우측으로i-k위치만큼 이동시킨다.
– k≥i이면 우측으로 한 위치 이동시킨다.
알파벳 크기가 크면 이것만으로도 좋은 성능을 보여줌
알고리즘 4장-스트링 매칭 28/34
동명대학교 멀티미디어공학과
he su r i t i csT: The a l gor i thm uses good suf f i x and bad character
good
good
good
good
good
good
good
good
• • • • • • • •
불일치 문자 방책의 비교 과정
알고리즘 4장-스트링 매칭 29/34
동명대학교 멀티미디어공학과
일치 접미부 방책
1) P[i..m-1] = T[j..j+m-i-1]이었으나 P[i-1]≠T[j-1]이라면 k<i이고 P[k..k+m-i-1]=P[i..m-1]인 최대의k에 대하여 P[k]가 T[j]에 정렬되도록 패턴을 우측으로 i-k만큼 이동시킨다.
2) 이러한 k가 없다면 P의 접두부가 P[i..m-1]의 접미부와 최대로 일치하도록 우측으로 m-1-SP[m-1]만큼 이동시킨다.
3) P와의 일치가 발생한 경우에는 일치된 T의 접미부와일치하는 최대 진접두부만큼, 즉 m-1-SP[m-1]만큼P를 우측으로 이동시킨다.
알고리즘 4장-스트링 매칭 30/34
동명대학교 멀티미디어공학과
T: a b c b c a b b a b a b a b c a a b b c c e a b e d a b c a b c a b … …
P: e d a b c a b c a b
e d a b c a b c a b
e d a b c a b c a b
e d a b c a b c a b
e d a b c a b c a b
e d a b c a b c a b
e d a b c a b c a b
e d a b c a b c a b
e d a b c a b c a b
e d a b c a b c a b
보이어-무어 알고리즘의 비교 과정
알고리즘 4장-스트링 매칭 31/34
동명대학교 멀티미디어공학과
LastPos(P, m, ∑, LP)
//입력 : 알파벳 ∑, 패턴 P, 패턴 크기 m,
//출력 : 크기 |∑|의 마지막 위치 배열 LP
{
1 for ( s∈ ∑인 각 문자 s ) LP[s]=-1;
2 for (i=0; i < m; i++) LP[P[i]]=i;
}
각 문자의 마지막 위치 구하기
알고리즘 4장-스트링 매칭 32/34
동명대학교 멀티미디어공학과
GoodSuffix ( P, m, skip ) {// 입력 : 패턴 P, 크기 m,
// 출력 : 이동거리가 들어있는 배열 skip[-1..m-1]
PR = reverse(P)computeSP (PR, SP, m);for (i=-1; i<=m-1; i++) skip[i]=m-1-SP[m-1]; for (k=0; k<=m-1; k++) {
i = m-1-SP[k];if (skip[i] > k- SP[k]) skip[i]=k-SP[k];
}}
일치 접미부 방책의 이동 거리 계산 알고리즘
알고리즘 4장-스트링 매칭 33/34
동명대학교 멀티미디어공학과
BM ( T, n, P, m, ∑ )
//입력 : 텍스트 T[0..n-1], 패턴 P[0..m-1], 알파벳 ∑
//출력 : 패턴의 발생위치
{
1 LastPos(P, m, ∑, LP); //LP: 알파벳 크기의 마지막 위치 배열
2 GoodSuffix(P, m, skip); // skip[-1..m-1]: 일치 접미부 방책의 이동거리
3 j = 0;
4 while (j <= n-m) {
5 for (i=m-1; i>=0 && P[i]==T[j+i]; i--); // 문자 비교 – 우에서 좌
6 if (i == -1) {
7 printf (“패턴이 위치 %d에서 발생”, j);8 j = j + skip[-1];
9 }
10 else j = j + max(skip[i], i-LP[T[j+i]]);
11 }
}
BM 알고리즘