아호–코라식 다중 패턴 검색 계산기
패턴 여러 개를 한 번에 찾는 아호–코라식 오토마타를 만들어 실패 링크와 출력 링크를 표로 보여 줍니다. 패턴이 몇 개든 텍스트를 한 번만 훑는다는 것을, 하나씩 훑는 방법과 견줘 확인할 수 있습니다.
50개까지, 하나당 200자까지 다룹니다. 지금 4개입니다.
5,000자까지 다룹니다. 지금 6자입니다.
찾은 개수
3건
패턴 4개를 찾으려고 텍스트 6자를 한 번 훑었습니다. 겹쳐 나오는 것도 모두 셉니다.
찾은 자리
| 시작 | 끝 | 패턴 |
|---|---|---|
| 2 | 4 | she |
| 3 | 4 | he |
| 3 | 6 | hers |
텍스트에서 시작하는 자리
ushers
오토마타
| 노드 | 읽은 글자열 | 실패 링크 | 출력 |
|---|---|---|---|
| 0 | (뿌리) | — | — |
| 1 | h | (뿌리) | — |
| 2 | he | (뿌리) | he |
| 3 | s | (뿌리) | — |
| 4 | sh | h | — |
| 5 | she | he | she → he |
| 6 | hi | (뿌리) | — |
| 7 | his | s | his |
| 8 | her | (뿌리) | — |
| 9 | hers | s | hers |
파란 줄은 패턴이 끝나는 노드입니다. 「출력」 칸의 화살표는 실패 링크를 따라가면 만나는 다른 패턴의 끝을 가리킵니다 — 이 사슬을 따라가지 않으면 짧은 패턴을 놓칩니다.
사용 방법
- 1찾을 패턴을 한 줄에 하나씩 넣습니다.
- 2검색할 텍스트를 넣습니다.
- 3찾은 자리와 패턴을 확인합니다. 겹쳐 나오는 것도 모두 셉니다.
- 4오토마타 표에서 각 노드의 실패 링크와 출력 링크를 봅니다.
- 5패턴 수를 늘려 가며 훑는 횟수가 어떻게 달라지는지 견줍니다.
자주 묻는 질문
패턴 여러 개를 한 번에 찾는 문자열 검색 알고리즘입니다. 1975년 알프레드 아호와 마거릿 코라식이 발표했으며, 패턴들을 트라이로 쌓은 뒤 어긋났을 때 돌아갈 자리를 미리 이어 둡니다. 패턴이 몇 개든 텍스트를 한 번만 지나가므로 O(패턴 길이 합 + 텍스트 길이 + 찾은 개수)에 끝납니다.
KMP의 실패 함수를 트라이 위로 올린 것이 아호–코라식입니다. KMP는 패턴 하나에 대해 「어긋나면 패턴의 어디로 돌아갈지」를 미리 적어 두는데, 아호–코라식은 그 실패 함수를 여러 패턴을 쌓은 트라이의 모든 노드에 붙입니다. 패턴이 하나뿐이면 아호–코라식은 사실상 KMP와 같습니다.
지금까지 읽은 글자의 진짜 접미사이면서 트라이에 있는 가장 긴 것을 가리킵니다. she까지 읽고 다음 글자가 어긋났다면 처음부터 다시 읽는 대신 he로 돌아가 이어 볼 수 있습니다. 너비 우선으로 훑으면 부모의 실패 링크가 이미 정해져 있으므로 자식의 실패 링크는 부모의 것을 따라가며 한 번에 정해집니다.
한 패턴이 다른 패턴의 접미사일 때 짧은 쪽을 놓치지 않기 위해서입니다. he, she, his, hers를 찾을 때 ushers를 읽으면 hers가 끝나는 자리에서 he도 함께 끝나는데, 트라이 노드에 적힌 패턴만 보면 he를 놓칩니다. 그래서 실패 링크를 따라가며 만나는 「패턴이 끝나는 노드」를 미리 이어 두고, 매치가 나올 때마다 그 사슬을 끝까지 따라갑니다. 이 알고리즘에서 가장 자주 틀리는 자리입니다.
텍스트를 훑는 횟수는 그대로입니다. 패턴 수는 오토마타를 만드는 비용(패턴 길이의 합)에만 들어가고, 검색 자체는 텍스트 길이와 찾은 개수에만 비례합니다. 패턴마다 따로 검색하면 패턴 수 × 텍스트 길이가 되므로, 금칙어 필터처럼 찾을 것이 수백 개일 때 차이가 크게 벌어집니다.
모두 찾습니다. aba와 ababa를 ababa에서 찾으면 aba가 0번과 2번 자리에서 두 번, ababa가 0번 자리에서 한 번 나옵니다. 겹치는 것을 빼고 세는 것은 찾은 뒤에 고를 문제이며, 알고리즘 자체는 끝나는 자리마다 모두 알려 줍니다.
전송되지 않습니다. 오토마타 만들기와 검색은 모두 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.
알아두면 좋은 점
- 찾은 결과는 「패턴마다 텍스트를 처음부터 훑는」 무식한 검색과 대조해 고정했습니다. 알파벳과 패턴 조합을 바꿔 가며 만든 무작위 묶음 160개, 그리고 한 패턴이 다른 패턴의 접미사인 경우(a·ba·aba·baba·ababa)를 따로 검사합니다.
- 실패 링크가 정말 접미사를 가리키는지, 언제나 자기보다 얕은 곳을 가리키는지, 출력 링크가 패턴이 끝나는 노드만 가리키는지도 오토마타 전체를 훑어 확인합니다.
- 글자는 코드포인트 단위로 다룹니다. 한글은 물론 이모지가 섞여도 글자가 반쪽으로 갈리지 않습니다.
- 패턴은 50개·각 200자까지, 텍스트는 5000자까지 다룹니다. 표에는 앞부분만 그립니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.