위키득계정 ↗
기술

아호-코라식 알고리즘

아호-코라식 알고리즘기술
영어
Aho-Corasick algorithm
검색 대상
여러 문자열 패턴
주요 구조
트라이와 실패 링크
검색 비용
적절한 전이 및 출력 처리에서 O(n+z)
아호-코라식 알고리즘은 여러 패턴을 하나의 본문에서 함께 찾는 문자열 검색 알고리즘이다. 패턴들의 트라이에 실패 링크와 출력 정보를 더하여, 본문을 왼쪽부터 읽으면서 여러 패턴의 일치 상태를 함께 추적한다.

여러 패턴을 함께 찾기

본문 하나에 대해 패턴마다 검색을 반복하는 대신 패턴 집합을 미리 하나의 구조로 만든다. 예를 들어 패턴이 ab, bab, bc라면 겹치는 접두사를 트라이에서 공유할 수 있다. 본문을 읽을 때 현재 상태는 지금까지 읽은 끝부분 가운데 패턴의 접두사로 쓸 수 있는 정보를 나타낸다.

실패 링크의 역할

현재 상태에서 다음 문자로 바로 진행할 수 없을 때 실패 링크를 이용한다. 이 링크는 현재 문자열보다 짧은 접미사 중에서 트라이의 경로로 나타낼 수 있는 가장 긴 문자열의 상태로 이어진다. 이미 읽은 본문을 처음부터 되돌아가 비교하지 않고, 이어서 일치할 수 있는 짧은 후보를 유지하는 방식이다.

겹친 결과의 출력

본문이 bab일 때 패턴 bab뿐 아니라 끝의 ab도 일치한다. 현재 노드가 하나의 패턴 끝이라는 사실만 검사하면 이런 결과를 놓칠 수 있다. 실패 링크 쪽에 있는 패턴 끝도 출력 정보에 반영해야 한다. 겹치는 일치를 전부 찾을지, 겹치지 않는 일부만 선택할지는 별도의 결과 정책이다.

시간과 공간의 조건

전이와 실패 링크를 적절히 처리하면 길이 n인 본문을 검색하고 일치 결과 z개를 출력하는 데 O(n+z)이 걸린다. 출력 개수가 많으면 그 비용도 커진다. 전처리 시간과 메모리는 패턴 총길이뿐 아니라 문자 집합 크기와 전이를 배열로 저장할지 맵으로 저장할지에 따라 달라진다.

관련 문서

트라이 (자료 구조) / 문자열 검색 / 접두사 / 접미사 / 유한 상태 기계 / KMP 알고리즘 / 시간 복잡도