728x90
반응형
패턴 매칭에 사용되는 알고리즘
- 고지식한 패턴 검색 알고리즘(=Brute Force)
- 카프-라빈 알고리즘
- KMP 알고리즘
- 보이어-무어 알고리즘
고지식한 패턴 검색 (Brute Force)
- 문자열을 처음부터 끝까지 차례대로 순회, 패턴 내의 문자들을 일일이 비교
- 텍스트에서 패턴이 존재하는 모든 위치를 찾는 문제
- 시간복잡도 : O(MN)
M: 패턴의 길이, N: 텍스트의 길이
최악의 경우 텍스트의 모든 위치에 대해 패턴을 비교해야 함
패턴 매칭 알고리즘의 중요 포인트
- 일치하는 경우 ( t[i] == p[j] )
- i, j를 증가시켜서 다음 문자를 비교
- 불일치하는 경우
- 다음 매칭의 시작위치로 i, j 값을 설정
※ 자주 사용되는 대치어
텍스트 | 패턴 | |
기본 | t | p |
인덱스 | i | j |
길이 | m | n |
KMP 알고리즘
- 불일치가 발생한 텍스트 요소 앞부분에 어떤 문자가 있는지 알고 있는 것을 활용,
불일치가 발생한 앞 부분에 대하여 다시 비교하지 않고 매칭을 수행하는 방법 - 텍스트와 패턴 사이의 요소를 비교하면서
패턴의 접두어, 텍스트의 접미어를 계산해둔다- 현재 텍스트와 패턴이 일치하지 않을 때, 이후에 비교를 할 위치를 찾기 위함
- BF방식에서 불필요한 계산을 하지 않고 Jump가 가능
- 시간복잡도 : O(M+N)
보이어-무어 알고리즘
- 패턴의 오른쪽에서 왼쪽으로 비교
- 대부분의 사용 소프트웨어에서 사용하고 있는 알고리즘
- 시간복잡도 : O(MN)
- 보이어-무어-호스풀 알고리즘이라는 간단한 버전의 알고리즘이 있다
- 텍스트 문자를 다 보지 않아도 된다는 장점이 있따.
비교
- 찾으려고 하는 문자열 패턴의 길이 m, 총 문자열 길이 n
- 브루트 포스 알고리즘 : O(MN)
- KMP 알고리즘 : O(N) *일반적으로 좋음
- 보이어 무어 알고리즘 : O(MN)
'Algorithm Study > 이론' 카테고리의 다른 글
[알고리즘] 패턴 매칭 알고리즘 소스코드 (0) | 2022.08.18 |
---|---|
[파이썬] 시프트 연산자 이용 (0) | 2022.08.16 |
[확률과 통계] 순열과 조합 (0) | 2022.02.15 |
[이코테 자료구조] 5. 이진 탐색 (0) | 2022.01.13 |
[이코테 자료구조] 4. 정렬 알고리즘 (0) | 2021.12.11 |