1. 程式人生 > >子集構造法NFA轉換成DFA

子集構造法NFA轉換成DFA

教材《編譯原理》(龍書)第2版

關於這部分,教材在P94頁有說明,但是我覺得不容易理解,下面通過兩個例題來理解一下。

例題一:

這一題比較簡單,我們直接從答案找解題方法

第一步:要根據NFA畫出這個表格,可能有些模糊,表頭分別為I,Ia,Ib,狀態(是對I這一列自定義的狀態名稱)

下面我們來說一下第一行的三項如何得出:(S就是開始狀態)

 先以S開始,經過任意個ε得到的結點就是第一個I,這道題就是{X, 1,2},

然後將{X,1,2}中的每一個字元經過a (中間可以有ε)後得到的結點加起來,

X的Ia={1,2}, 1的Ia={1,2}, 2的Ia是空集,所以這一行的Ia={1,2}。

後面的Ib也是一樣,只不過是經過b後得到的結點的集合.

也就是說I的第一行第一列{X, 1,2},是從開始符號經過ε得到的集合,而Ia,Ib是集合中每個結點分別經過a,b得到的集合的並集。

第二行的第一列I,是第一行的Ia,如果仔細觀察,就可以發現:第一列都是將前面的Ia和Ib作為I計算新的Ia和Ib。

當然要注意重複的狀態集合,就沒有必要再作為I寫一次了。

直到把所有的新狀態都作為I寫一遍,這個表就完成了。

第二步:根據表格畫出DFA

將這些集合依次標號,這道題是{X,1,2}為X,{1,2}為1, {1,2,3}為2,{1,2,Y}為3,根據上面那個表就可以把圖畫出來了。

關於箭頭指向和箭頭的值,都要從每一行的三項來看,比如第一行,如果把集合換成自定義的狀態編號就是

I       Ia       Ib

X      1       2

意思就是X經過a到達狀態1,X經過b到達狀態2。

並且由於Y在NFA中是一個接受狀態,在表格的狀態3中也有Y,所以3是接受狀態。

例題二:

將下圖NFA轉換成DFA

這一個NFA中不含有ε,一開始我也不知該怎麼做,和上一題有一些小區別,是我同學給我講的,如果不對,就不要借鑑了。

區別就在於,每一個集合不再是把所有經過a,b的結點都寫入,而是隻寫第一個經過的結點,例如第一行的Ib,從A經過b的所有結點事{E,B},但是隻記錄了一個E。

最後的結果是:


--------------------- 
作者:elice_ 
來源:CSDN 
原文:https://blog.csdn.net/elice_/article/details/80550413