도구스개발

아호–코라식 다중 패턴 검색 계산기

패턴 여러 개를 한 번에 찾는 아호–코라식 오토마타를 만들어 실패 링크와 출력 링크를 표로 보여 줍니다. 패턴이 몇 개든 텍스트를 한 번만 훑는다는 것을, 하나씩 훑는 방법과 견줘 확인할 수 있습니다.

50개까지, 하나당 200자까지 다룹니다. 지금 4개입니다.

5,000자까지 다룹니다. 지금 6자입니다.

찾은 개수

3건

패턴 4개를 찾으려고 텍스트 6자를 한 번 훑었습니다. 겹쳐 나오는 것도 모두 셉니다.

오토마타 노드10개
패턴 길이 합12자
읽은 글자6자
실패 링크를 따라간 횟수1회
하나씩 훑으면 견주는 횟수23회

찾은 자리

시작패턴
24she
34he
36hers

텍스트에서 시작하는 자리

ushers

오토마타

노드읽은 글자열실패 링크출력
0(뿌리)
1h(뿌리)
2he(뿌리)he
3s(뿌리)
4shh
5sheheshe → he
6hi(뿌리)
7hisshis
8her(뿌리)
9hersshers

파란 줄은 패턴이 끝나는 노드입니다. 「출력」 칸의 화살표는 실패 링크를 따라가면 만나는 다른 패턴의 끝을 가리킵니다 — 이 사슬을 따라가지 않으면 짧은 패턴을 놓칩니다.

KMP의 실패 함수를 트라이 위로 올린 것이 아호–코라식입니다. 패턴들을 트라이로 쌓고, 각 노드에 「지금까지 읽은 글자의 진짜 접미사이면서 트라이에 있는 가장 긴 것」을 가리키는 실패 링크를 붙입니다. she까지 읽고 어긋났다면 처음부터 다시 읽는 대신 he로 돌아가 이어 볼 수 있습니다.
출력 링크를 빠뜨리면 답을 놓칩니다. he·she·his·hers로 ushers를 읽으면 hers가 끝나는 자리에서 he도 함께 끝나는데, 트라이 노드에 적힌 패턴만 보면 he를 놓칩니다. 한 패턴이 다른 패턴의 접미사일 때 생기는 일이라, 실패 링크를 따라가며 만나는 「패턴이 끝나는 노드」를 미리 이어 두고 매치마다 그 사슬을 끝까지 따라갑니다. 이 알고리즘에서 가장 자주 틀리는 자리입니다.
패턴이 몇 개든 텍스트는 한 번만 지나갑니다. 패턴 수는 오토마타를 만드는 비용(패턴 길이의 합)에만 들어가고, 검색은 텍스트 길이와 찾은 개수에만 비례합니다. 위의 「읽은 글자」와 「하나씩 훑으면 견주는 횟수」를 견줘 보면 차이가 보입니다 — 패턴을 늘려도 앞의 값은 그대로인데 뒤의 값만 커집니다. 금칙어 필터처럼 찾을 것이 수백 개일 때 이 차이가 결정적입니다.

사용 방법

  1. 1찾을 패턴을 한 줄에 하나씩 넣습니다.
  2. 2검색할 텍스트를 넣습니다.
  3. 3찾은 자리와 패턴을 확인합니다. 겹쳐 나오는 것도 모두 셉니다.
  4. 4오토마타 표에서 각 노드의 실패 링크와 출력 링크를 봅니다.
  5. 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일 · 결과는 참고용 추정치입니다.