[源] http://www2.gdin.edu.cn/jkx/webstudy/bianyiyuanli/fornpage/chapter03/section3/03.3.3.htm
不確定的有窮自動機N的確定化
根據定義,顯然DFA是NFA的特例。對于每個NFA M,存在一個DFA M′,使得 L(M)=L(M′)。
對于任何兩個有窮自動機M和M′,如果L(M)=L(M′),則稱M與M′是等價的。
我們將介紹一種算法,對于給定的NFA M,構造其等價的DFA M′。
不確定的有窮自動機N的確定化
根據定義,顯然DFA是NFA的特例。對于每個NFA M,存在一個DFA M′,使得 L(M)=L(M′)。
對于任何兩個有窮自動機M和M′,如果L(M)=L(M′),則稱M與M′是等價的。
我們將介紹一種算法,對于給定的NFA M,構造其等價的DFA M′。
請你注意這個結論:DFA是NFA的特例 對每個NFA N一定存在一個DFA M,使得L(M)=L(N)。對每個NFA N存在著與之等價的DFA M。與某一NFA等價的DFA不唯一。 在有窮自動機的理論里,有這樣的定理:設L為一個由不確定的有窮自動機接受的集合,則存在一個接受L的確定的有窮自動機。我們不對定理進行證明,只介紹一種算法(這種算法稱為子集法),將NFA轉換成接受同樣的語言的DFA。 為什麼對DFA如此親睞呢?因為它的行為很容易用程序來模擬。 DFA M=(K,Σ,f,S,Z)的行為的模擬程序
為介紹算法首先定義對狀態(tài)集合I的幾個有關運算: 1. 狀態(tài)集合I的ε-閉包,表示為ε-closure(I),定義為一狀態(tài)集,是狀態(tài)集I中的任何狀態(tài)S經任意條ε弧而能到達的狀態(tài)的集合。 回顧在前面章節(jié)對轉換函數的擴充:如輸入字符是空串,則自動機仍停留在原來的狀態(tài)上,顯然,狀態(tài)集合I的任何狀態(tài)S都屬于ε-closure(I)。 2. 狀態(tài)集合I的a弧轉換,表示為move(I,a),定義為狀態(tài)集合J,其中J是所有那些可從I中的某一狀態(tài)經過一條a弧而到達的狀態(tài)的全體。 我們使用圖4.4的NFA N的狀態(tài)集合來理解上述兩個運算。 |
即{0,1,2,4,7}中的任一狀態(tài)都是從狀態(tài)0經任意條ε弧可到達的狀態(tài),令{0,1,2,4,7}=A,則 move(A,a)={3,8},因為在狀態(tài)0,1,2,4和7中,只有狀態(tài)2和7有a弧射出,分別到達狀態(tài)3和8。 而ε-closure({3,8})={1,2,3,4,6,7,8}。 再看一個例子,對下圖所示NFA的狀態(tài)集合I的運算
I={5},ε-closure(I)={5,6,2}; move({1,2},a)={5,3,4} ε-closure({5,3,4})={2,3,4,5,6,7,8}; |
NFA確定化算法:假設NFA N=(K, ∑,f,K0,Kt)按如下辦法構造一個DFA M=(S, ∑,d,S0,St),使得L(M)=L(N): |
① M的狀態(tài)集S由K的一些子集組成(k的子集構造算法見下頁)。用[S1 S2... Sj]表示S的元素,其中S1, S2,,... Sj是K的狀態(tài)。并且約定,狀態(tài)S1, S2,,... Sj是按某種規(guī)則排列的,即對于子集{S1, S2}={ S2, S1,}來說,S的狀態(tài)就是[S1 S2]; ② M和N的輸入字母表是相同的,即是∑; ③ 轉換函數是這樣定義的: d([S1 S2,... Sj],a)= [R1R2... Rt] 其中 {R1,R2,... , Rt} = e-closure(move({S1, S2,,... Sj},a)) ④ S0=e-closure(K0)為M的開始狀態(tài); ⑤ St={[Si Sk... Se],其中[Si Sk... Se]∈S且{Si , Sk,,... Se}∩Kt≠φ} |
構造NFA N的狀態(tài)K的子集的算法: 假定所構造的子集族為C,即C= (T1, T2,,... TI),其中T1, T2,,... TI為狀態(tài)K的子集。 ① 開始,令e-closure(K0)為C中唯一成員,并且它是未被標記的。 ② while (C中存在尚未被標記的子集T)do { 標記T; for 每個輸入字母a do { U:= e-closure(move(T,a)); if U不在C中 then 將U作為未標記的子集加在C中 } } |
① S={[T0],[T1],[T2],[T3],[T4]} ② Σ={a,b} ③ D([T0],a)=[T1] D([T2],a)=[T1] D([T0],b)=[T2] D([T2],b)=[T2] D([T1],a)=[T1] D([T3],a)=[T1] D([T1],b)=[T3] D([T3],b)=[T4] D([T4],a)=[T1] D([T4],b)=[T2] ④ S0=[T0] ⑤ St=[T4] 不妨將[T0],[T1],[T2],[T3],[T4]重新命名,以利于書寫,或用A,B,C,D,E或用0,1,2,3,4分別表示。若采用后者,該DFA M的狀態(tài)轉換圖如圖4.6所示。 |
|