34
알고리즘 4장-스트링 매칭 1/34 동명대학교 멀티미디어공학과 알고리즘 4장-스트링 매칭 멀티미디어공학과 조 미 경 교수

알고리즘4장-스트링매칭cfs5.tistory.com/upload_control/download.blog?fhandle=... · 알고리즘4장-스트링매칭 3/34 동명대학교멀티미디어공학과 직선적알고리즘

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

알고리즘 4장-스트링 매칭 1/34

동명대학교 멀티미디어공학과

알고리즘 4장-스트링 매칭

멀티미디어공학과

조 미 경 교수

알고리즘 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장-스트링 매칭 25/34

동명대학교 멀티미디어공학과

KMP 알고리즘 분석

O(m+n) 시간

– 최대 접두부 테이블을 전처리 → O(m)

– 매칭 → O(n)

알고리즘 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 알고리즘

알고리즘 4장-스트링 매칭 34/34

동명대학교 멀티미디어공학과

BM의 시간복잡도

최악 - O((n-m+1)m +|Σ|)

Galil은 최악의 시간도 O(m+n+|Σ|)인 알고리즘 발견.

최선 – O(m+n/m +|Σ|) → 실제로 이렇게 수행

될 가능성이 높음. 특히 알파벳이 큰 경우.