1. Minimalny DFA
Dla każdego języka regularnego istnieje dokładnie jeden (z dokładnością do izomorfizmów) DFA o minimalnej liczbie stanów.
(Własność ta wynika z twierdzenia Myhill-Nerode, które jednak zostanie pominięte na wykładzie.)
2. Idea algorytmu
Chcemy znaleźć takie stany, które można ze sobą połączyć (stan równoważne). Dwa stany równoważne to takie, że dla każdego x startujące z tych stanów albo znajdziemy się równocześnie w stanach akceptujących, albo nieakceptujących.
3. Algorytm minimalizacji
Oznaczamy pary stanów, które nie są równoważne.
for all p∈F∧q∈Q∖F do flag (p,q)
for all p,q∈(F×F)∪(Q∖F×Q∖F) takich że p=q do:
if ∃a∈Σ taki że (δ(p,a),δ(q,a)) is flagged then:
flag (p,q)
flag w sposób rekurencyjny wszystkie nieoznaczone pary na liście (p,q)
else (żadna para (δ(p,a),δ(q,a)) nie jest oznaczona)
for all a∈Σ do:
- umieść parę (p,q) na liście (δ(p,a),δ(q,a)) pod warunkiem, że δ(p,a)=δ(q,a)
DFA uzyskany przez złączenie stanów równoważnych uzyskanych przez powyższy algorytm, z usuniętymi stanami nieosiągalnymi, jest minimalnym DFA dla danego języka.
4. Przykład
M=({a,b,c,d,e,f},{0,1},δ,a,{c,d,e})
| a |
|
b |
c |
| b |
|
a |
d |
| c |
|
e |
f |
| d |
|
e |
f |
| e |
|
e |
f |
| f |
|
f |
f |
Pomarańczowe X — pierwszy etap
Niebieskie X — drugi etap

- (a,b)
- 0: (a,b) — nie to nam nie mówi
- 1: (c,d) — na razie nieoznaczone
- (a,f)
- 0: (b,f) — na razie nieoznaczone
- 1: (c,f) — oznaczone
- (b,f)
- 1: (d,f) — oznaczone
- (c,d), (c,e), (d,e) — nic nie mogę
Czyli sklejamy:
- (a,b)
- (c,d), (c,e), (d,e)
Uproszczony DFA: M′=({ab,cde,f},{0,1},δ,ab,{cde})
| ab |
|
ab |
cde |
| cde |
|
cde |
f |
| f |
|
f |
f |
