NFA→DFA 변환기 (부분집합 구성)
ε-전이가 있는 비결정 오토마타를 부분집합 구성으로 DFA로 바꾸고 상태까지 최소화합니다. 길이 8 이하 모든 문자열에서 원래 NFA와 판정이 같은지 그 자리에서 대조해 보여 줍니다.
「상태 글자 상태」를 한 줄에 하나씩. ε 전이는 글자 자리에 eps. start:·accept: 로 시작·받아들이는 상태를 지정합니다. 상태 14개까지.
DFA 상태 수
2개
NFA 상태 2개가 DFA 2개가 되었습니다. 최소화해도 줄지 않았다는 것은 이 상태들이 저마다 다른 것을 기억하고 있다는 뜻입니다.
ε-닫힘
| 상태 | ε로 갈 수 있는 곳 |
|---|---|
| q0 | {q0} |
| q1 | {q1} |
시작도 시작 상태의 ε-닫힘에서 출발하고, 글자를 읽은 뒤에도 다시 ε-닫힘을 취해야 합니다. 두 번째를 빠뜨리는 것이 이 알고리즘에서 가장 흔한 구현 실수입니다.
부분집합 구성 — DFA 상태 하나가 NFA 상태 집합 하나
| DFA | NFA 상태 집합 | a | b | 받아들임 |
|---|---|---|---|---|
| D0시작 | {q0} | D1 | D0 | |
| D1 | {q0, q1} | D1 | D0 | ● |
NFA 상태 집합에 받아들이는 상태가 하나라도 들어 있으면 그 DFA 상태도 받아들입니다. 갈 곳이 없어 공집합이 되는 자리는 버리지 않고 함정 상태로 남깁니다 — DFA는 모든 상태에서 모든 글자에 갈 곳이 있어야 하기 때문입니다.
최소화 — 분할 다듬기
받아들이는 상태와 아닌 상태로 가른다
더 쪼갤 수 없을 때 멈추면 그것이 최소 DFA입니다. 마이힐–네로드 정리에 따라 이 최소 DFA는 상태 이름을 빼면 유일합니다.
최소 DFA — 2개 상태
| 상태 | 합쳐진 것 | a | b | 받아들임 |
|---|---|---|---|---|
| M0 | D0 | M1 | M0 | |
| M1 | D1 | M1 | M0 | ● |
사용 방법
- 1전이를 한 줄에 하나씩 「상태 글자 상태」로 적습니다. ε 전이는 글자 자리에 eps를 적습니다.
- 2「start: q0」으로 시작 상태를, 「accept: q2」로 받아들이는 상태를 지정합니다.
- 3ε-닫힘 표와 부분집합 구성 표에서 DFA 상태 하나가 NFA 상태 어느 집합인지 확인합니다.
- 4아래 최소화 과정에서 어떤 상태들이 합쳐졌는지 회차별로 볼 수 있습니다.
자주 묻는 질문
NFA가 지금 있을 수 있는 상태들의 집합을 DFA의 한 상태로 삼는 방법입니다. NFA는 한 글자를 읽고 여러 곳으로 동시에 갈 수 있는데, 「갈 수 있는 곳 전부」를 하나의 이름으로 부르면 갈 곳이 하나로 정해져 DFA가 됩니다. NFA와 DFA의 표현력이 같다는 정리의 증명이 곧 이 알고리즘입니다.
어떤 상태 집합에서 글자를 읽지 않고 갈 수 있는 곳을 모두 더한 것입니다. 시작도 시작 상태의 ε-닫힘에서 출발하고, 글자를 읽은 뒤에도 다시 ε-닫힘을 취해야 합니다. 이 두 번째를 빠뜨리는 것이 이 알고리즘에서 가장 흔한 구현 실수입니다.
늘어납니다. 「뒤에서 n번째 글자가 a인 문자열」이 그런 언어입니다. NFA로는 n+1개 상태면 되지만 — a를 하나 찍고 아무 글자나 n−1개 세면 끝입니다 — DFA는 마지막 n글자를 전부 기억해야 하므로 2ⁿ개가 필요합니다. 이 계산기에 그 예제를 넣어 두었고, 최소화해도 하나도 줄지 않는 것까지 확인할 수 있습니다. 기억할 것이 정말 그만큼 있다는 뜻입니다.
DFA는 모든 상태에서 모든 글자에 대해 갈 곳이 있어야 하기 때문입니다. 부분집합 구성에서 어디로도 갈 수 없으면 공집합이 나오는데, 이것을 버리지 않고 죽은 상태로 남겨야 정의를 만족하는 DFA가 됩니다. 함정 상태에서는 어느 글자를 읽어도 자기 자신으로 돌아옵니다.
「받아들이는 상태 / 아닌 상태」 두 덩어리에서 시작해, 같은 덩어리 안인데 어떤 글자로 서로 다른 덩어리로 가는 상태들을 쪼갭니다. 더 쪼갤 수 없을 때 멈추면 그것이 최소 DFA입니다. 마이힐–네로드 정리에 따라 이 최소 DFA는 유일합니다(상태 이름을 빼면).
길이 8 이하 모든 문자열을 원래 NFA·변환된 DFA·최소화된 DFA에 각각 넣어 판정이 모두 같은지 대조합니다. 결과 화면에 몇 개를 대조했는지, 어긋난 것이 있는지 그대로 나옵니다. 어긋나는 문자열이 하나라도 있으면 변환이 잘못된 것입니다.
전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.
알아두면 좋은 점
- 검증은 세 오토마타를 나란히 굴려 대조하는 방식입니다. 원래 NFA·부분집합 구성으로 만든 DFA·최소화한 DFA에 길이 8 이하 모든 문자열을 넣어 판정이 전부 같은지 확인하며, 이 대조는 계산기 화면에서도 그대로 돌아갑니다.
- 「뒤에서 n번째가 a」 예제에서 DFA 상태 수가 정확히 2ⁿ개인 것, 최소화해도 하나도 줄지 않는 것, NFA는 n+1개면 되는 것을 n = 1~5에서 고정했습니다. 이 언어는 정의 그대로의 판정(문자열 뒤에서 n번째 글자 보기)과도 대조했습니다.
- 검증에서 잡은 것이 하나 있습니다. 처음에는 start·accept에 적힌 이름을 상태 목록에 그대로 더했는데, 그러면 오타로 적은 이름이 고립된 상태로 조용히 만들어져 「없는 상태」 검사가 아무것도 잡지 못했습니다. 상태는 전이에 나오는 것만으로 정하도록 고쳤습니다.
- DFA와 최소 DFA 모두 모든 상태에서 모든 글자의 갈 곳이 있는지 검사합니다. 함정 상태를 버리면 이 성질이 깨지므로 공집합을 죽은 상태로 남깁니다.
- ε 표기는 eps·ε·epsilon·λ를 모두 읽고, 전이 구분자로 공백·쉼표·화살표를 모두 읽습니다.
- NFA 상태 14개·글자 6개까지, DFA 상태는 128개까지 다룹니다. 그보다 커지면 표가 화면에 들어오지 않고, 부분집합 구성이 2ⁿ로 터지는 것을 보이는 데는 이 크기로 충분합니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.