DFA 최소화(호프크로프트) 계산기
결정적 유한 오토마타(DFA)에서 도달 불가능한 상태를 걷어내고, 분할 세련화로 서로 구별할 수 없는 상태를 뭉쳐 같은 언어를 받아들이는 가장 작은 DFA를 구합니다. 라운드마다 블록이 어떻게 쪼개지는지 표로 보여 줍니다.
상태마다 한 줄, 알파벳 순서대로 간 곳의 상태 번호를 적습니다. 5행 필요.
최소 DFA 상태 수
3개
원래 5개 → 도달 가능 3개 → 최소 3개
분할 세련화 — 라운드별 블록
| 라운드 | 블록 수 | 블록 (도달가능 DFA 상태 번호) |
|---|---|---|
| 0 | 2 | {0,1} {2} |
| 1 | 3 | {0} {1} {2} |
| 2 | 3 | {0} {1} {2} |
블록 개수가 이전 라운드와 같아지면 멈춥니다. 분할은 쪼개지기만 하므로, 개수가 그대로라는 것은 더 쪼갤 것이 없다는 뜻입니다.
사용 방법
- 1알파벳(기호 목록)과 상태 수, 시작 상태, 수락 상태를 입력합니다.
- 2전이표를 상태마다 한 줄씩, 기호 순서대로 적습니다.
- 3도달 불가능한 상태가 먼저 걷어내지는 것을 확인합니다.
- 4분할 세련화가 라운드마다 블록을 어떻게 쪼개는지 보고, 최종 최소 DFA와 언어가 같은지 전수 검산 결과를 확인합니다.
자주 묻는 질문
마이힐–네로드 정리에 따르면, 같은 언어를 받아들이는 DFA 가운데 상태 수가 가장 적은 것은(상태 이름 붙이기 차이를 빼면) 유일합니다. 그래서 "최소화"는 상태를 임의로 지우는 것이 아니라, 서로 구별할 수 없는 상태들을 정확히 찾아 하나로 합치는 과정입니다.
그 상태에서 시작해 어떤 문자열을 이어 붙여도 두 상태 모두 항상 같은 결과(둘 다 수락하거나 둘 다 거부)를 낸다는 뜻입니다. 반대로 구별하는 문자열이 하나라도 있으면 두 상태는 합칠 수 없습니다.
시작 상태에서 갈 수 없는 상태는 언어에 아무 영향을 주지 않아 항상 서로 구별 불가능하게 뭉뚱그려지고, 그러면 최소화 결과가 실제보다 작거나 잘못된 방향으로 나올 수 있습니다. 그래서 분할 세련화를 돌리기 전에 반드시 도달 가능한 상태만 남겨야 합니다.
처음에는 수락 상태와 비수락 상태, 딱 두 덩어리로 나눕니다. 이후 매 라운드마다 "지금 같은 덩어리에 있고, 각 기호마다 간 곳도 같은 덩어리인" 상태들만 한 덩어리로 남기고 나머지는 쪼갭니다. 블록 개수가 이전 라운드와 같아지면(=아무도 안 쪼개지면) 멈춥니다.
길이 0부터 지정한 최대 길이까지의 모든 문자열을 실제로 넣어, 원래 DFA와 최소화한 DFA의 수락 여부가 항상 같은지 전수 확인합니다. 다르면 그 문자열을 반례로 보여 줍니다.
네, 다른 단계입니다. dev/nfa-dfa가 비결정적 오토마타(NFA)를 부분집합 구성법으로 결정적 오토마타(DFA)로 바꾸는 도구라면, 이 도구는 이미 DFA인 것을 더 작게(최소로) 만드는 다음 단계입니다.
호프크로프트가 제시한 O(n log n) 최적화(작은 쪽 블록만 골라 분할을 전파하는 방식)까지는 아니고, 그 바탕이 되는 분할 세련화(Moore식, O(n²·|Σ|))를 그대로 구현했습니다. 결과로 나오는 최소 DFA는 두 방식 모두 똑같습니다 — 차이는 속도뿐입니다. 이 계산기가 다루는 작은 DFA에서는 체감되지 않습니다.
전송되지 않습니다. 계산은 모두 브라우저 안에서 이뤄지고 입력값은 이 기기에만 남습니다.
알아두면 좋은 점
- 도달 불가능한 상태(중복 상태 포함)를 일부러 섞은 예제("끝이 01로 끝나는가" DFA에 여분 상태 2개 추가)에서, 걷어낸 뒤의 언어가 걷어내기 전과 똑같은지, 최소화 결과가 교과서대로 3상태가 되는지 확인했습니다.
- 분할이 라운드가 갈수록 블록 개수가 줄어드는 일은 없는지(쪼개지기만 하는지) 검산했습니다.
- 모든 상태가 수락(또는 모두 거부)이면 1상태로 합쳐지는 극단적인 경우도 확인했습니다.
- 이 계산기는 교육용으로 상태 수가 많지 않은 DFA를 다룹니다. 상태·알파벳이 크면 전수 검산에 걸리는 시간이 알파벳 크기의 지수로 늘어나므로 검산 길이를 제한합니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.