NFA(不確定的有窮自動機)轉化為DFA(確定的有窮自動機)
NFA轉換DFA,通常是將帶空串的NFA(即:ε-NFA)先轉化為不帶空串的NFA(即:NFA),然后再轉化為DFA。
提示:ε是空串的意思!空串沒有任何字符!
這里直接講將ε-NFA轉化為DFA的過程,將NFA轉化為DFA的情況類似。
轉化的過程總的來說有兩大步驟:ε-NFA轉化為DFA,以及DFA簡化
ε-NFA轉化為DFA前件知識
1、對狀態圖進行改造
增加狀態X,Y,使之成為新的唯一的初態和終態,從X引ε弧到原初態節點,從原終態節點引ε弧到Y節點。
2、利用子集法對NFA進行確定化。
- 子集法
子集法:將NFA轉化為接受同樣語言的DFA。
DFA的每一個狀態對應NFA的一組狀態;
DFA使用它的狀態去記錄NFA讀入一個符號后可能達到的所有狀態
如上圖,A對應ε-NFA的0和1狀態,A代表的是一組狀態。因此,DFA使用它的狀態去記錄NFA讀入一個符號后可能達到的所有狀態。
- 構造狀態轉化表
- ε-closure(ε-閉包)
狀態集合I的ε-閉包是一狀態集。
①任何狀態q∈I,則q∈ε-closure(I)
②任何狀態q∈I,則q經任意條ε弧而能到達的狀態q'∈ε-closure(I)
比如上圖,假設I={0},那么0∈ε-closure(I);並且0經ε弧能到達1狀態,因此,1∈ε-closure(I)。即:ε-closure({0})={0,1}。
案例再現
可能前面的理論有些亂,理不清,這里用一個例題演繹如何將ε-NFA轉化為DFA。
已知下面的NFA圖,求確定后的DFA:
①改造狀態圖:在起始狀態分別加上X、Y狀態,連接輸入符號為ε。
②狀態轉換表
狀態集合 \狀態 | 0 | 1 |
---|---|---|
A={X,0,2,1} | B={2,3,1} | C={2,1} |
B={2,3,1} | D={2,4,3,1,Y} | C={2,1} |
C={2,1} | B={2,3,1} | C={2,1} |
D={2,4,3,1,Y} | D={2,4,3,1,Y} | C={2,1} |
!提示:A,B,C,D表示狀態集合;0,1分別表示狀態0和1。第二行第二列表示狀態集合A的狀態在輸入符號0后到達的狀態的ε-閉包為B={2,3,1}。
獲得改造后的狀態圖后,我們找到起始狀態為X,由於X與0之間是輸入的ε符號,所以X與0等價;同理,0與2等價,1與2等價。所以,起始狀態有{X,0,2,1},我們給它命名為狀態A。
再看第二列,處於起始狀態A時,當輸入字符為0時到達的狀態分別有:2輸入0到達2本身;1輸入0到達3,因此還有3狀態。再看與2等價的狀態有:1;與3等價的狀態無。因此,輸入字符0時到達的狀態有{2,3},它的閉包是:{2,3,1}。
第三列同理,處於起始狀態A時,當輸入字符為1時到達的狀態只有2。2的等價狀態有1。因此,輸入字符1時A到達的狀態有{2},它的閉包是{2,1}。
!注意:狀態轉換表里面填入的是閉包結果。
最后得到的DFA圖為:(未簡化)
DFA簡化
狀態S和狀態T等價的條件
- 一致性條件:狀態S和T必須同時為可接受狀態或不可接受狀態。
- 蔓延性條件:對於所有符號,狀態S和T必須轉換到等價的狀態里。
DFA簡化算法:
1、假定一個集合中的狀態都是等價的,首先將DFA的所有狀態放在一個集合I中。
2、所有狀態分成兩個子集——終態集和非終態集。運用判定狀態等價原則分別對兩個子集的狀態進行分析和划分。若發現某個狀態與其他狀態不等價,則將其作為一個新的狀態子集,如果無法區分,則放在同一子集中。
3、從每個子集中選出一個狀態做代表,即可構成簡化的DFA。
4、含有原來初態的子集仍為初態,各終態的子集仍為終態。
案例再現
將上面未簡化的DFA圖簡化:
①I = {A,B,C,D}
②拆分終態集和非終態集:
非終態集{A,B,C}+終態集{D}
③對{A,B,C}繼續拆分:
A輸入0后到達B,而B⊆{A,B,C},故A不能拆分;
再看B,B輸入0后到達D,而D¢{A,B,C},故B可以拆分;
再看C,C輸入0后到達B,B⊆{A,B,C},故C也不能拆分。
綜上:{A,B,C}可拆分為{A,C}+{B}。
④對{A,C}繼續拆分:
A輸入1時到達C,而C⊆{A,C},故A不可拆分;
再看C,C輸入1時到達C狀態,而C⊆{A,C},故C也不可拆分。
⑤綜合起來,上面未簡化的DFA圖簡化后得到的狀態應該是:{A,C}+{B}+{D}。
!注意:同一個{}大括號里面的狀態是等價的,因此,畫圖時選其一即可。
簡化后的DFA圖為:
Are you got it?(你學會了嗎?)