여름의 서재
[알고리즘 종류] 보이어-무어 알고리즘 본문
728x90
- 보이어-무어 알고리즘
- 대부분의 상용 소프트웨어에서 채택하고 있는 알고리즘
- 패턴에 오른쪽 끝 문자부터 검사하고 불일치하면 패턴에서 일차는 문자를 찾아서 이동함.
- 패턴에 오른쪽 끝에 있는 문자가 불일치하고 이 문자가 패턴 내에 존재하지 않는 경우 , 이동거리는 무려 패턴의 길이 만큼이 된다.
def boyer_moore(pattern, text):
M = len(pattern)
N = len(text)
i = 0
#반복은 최대 긴텍스트 길이 - 작은텍스트 길이
while i <= N-M:
j = M - 1
while j >= 0:
if pattern[j] != text[i+j]:
move = find(pattern, text[i + M - 1]) # 제일 마지막 문자부터 찾기
break
j = j - 1
if j == -1: # 인덱스가 -1이라는 뜻은 모든 글자가 맞았다는 뜻
return i # 검색 성공
else: #- 1이 아니라면 글자를 못찾은 것이므로 find에서 넘겨준 값만큼 옆으로 이동한다.
i += move
return -1 # 검색 실패
#불필요한 비교를 건너뛰기 위한 함수
def find(pattern, char):
for i in range(len(pattern)-2, -1, -1):
#마지막글자와 패턴중 일치하는 숫자가 있다면 그만큼 이동한다.
if pattern[i] == char:
return len(pattern) -i -1
#일치하는 글자가 없다면 패턴의 길이만큼 이동한다.
return len(pattern)
'알고리즘 > 알고리즘 종류' 카테고리의 다른 글
[알고리즘 종류] 투 포인터(Two Pointer) (0) | 2021.08.16 |
---|---|
[알고리즘 종류] DFS(깊이우선탐색) & BFS(너비우선탐색) (0) | 2021.08.13 |
[알고리즘 종류] KMP 알고리즘 (0) | 2021.08.13 |
[알고리즘 종류] 브루트 포스 (Brute Force) (0) | 2021.08.13 |
[알고리즘 종류] 이진 탐색 (Binary Search) (0) | 2021.08.13 |
Comments