正規式轉確定有窮自動機(NFA)

博文轉自: http://www.cnblogs.com/cute/p/4021689.html

整體的步驟是三步: 
一,先把正規式轉換爲NFA(非確定有窮自動機), 
二,在把NFA通過“子集構造法”轉化爲DFA, 
三,在把DFA通過“分割法”進行最小化。

一步很簡單,就是反覆運用下圖的規則,圖1 
id="iframe_0.23764391709119081" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://leaverimage.b0.upaiyun.com/20920_o.png?_=4021689%22%20style=%22border:none;max-width:1128px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.23764391709119081',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="border-style: none; border-width: initial; width: 485px; height: 301px;">

這樣就能轉換到NFA了。 
給出一個例題,來自Google book。本文主要根據這個例題來講,圖2 
id="iframe_0.8500366944354028" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://leaverimage.b0.upaiyun.com/20924_o.jpg?_=4021689%22%20style=%22border:none;max-width:1128px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.8500366944354028',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="border-style: none; border-width: initial; width: 554px; height: 482px;"> 
二.子集構造法。 
同樣的例題,把轉換好的NFA確定化,圖3 
id="iframe_0.2256595294456929" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://leaverimage.b0.upaiyun.com/20921_o.jpg?_=4021689%22%20style=%22border:none;max-width:1128px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.2256595294456929',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="border-style: none; border-width: initial; width: 668px; height: 184px;">

這個表是從NFA到DFA的時候必須要用到的。第一列第一行I的意思是從NFA的起始節點經過任意個ε所能到達的結點集合。Ia表示從該集合開始經過一個a所能到達的集合,經過一個a的意思是可以略過前後的ε。同樣Ib也就是經過一個b,可以略過前後任意個ε。 
至於第二行以及後面的I是怎麼確定的。我參考了一些題目才明白,原來就是看上面的Ia和Ib哪個還沒出現在I列,就拿下來進行運算,該列對應的Ia和Ib就是前面我說的那樣推導。

如果還不太明白,看圖就是了。你會發現I中的幾個項目都在Ia和Ib中出現了。而且是完全出現

這步做完以後,爲了畫出最後的DFA,那麼肯定得標出一些號來,比如1.2.3.。或者A。 B。c,我一般標的方法是先把I列全部標上1.2.3.遞增。然後看1表示的集合和Ia和Ib中的哪個集合一樣,就把那個集合也表示爲1.繼續向下做。最後會得到這樣一個表格。圖4 
id="iframe_0.6487823026254773" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://leaverimage.b0.upaiyun.com/20922_o.jpg?_=4021689%22%20style=%22border:none;max-width:1128px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.6487823026254773',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="border-style: none; border-width: initial; width: 685px; height: 224px;">

至此,就可以表示出DFA了。就對照上面那個表,從0節點開始經過a到1.經過b到2,就這樣畫就行了。。

最後的DFA如下圖,圖5 
id="iframe_0.44275509053841233" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://leaverimage.b0.upaiyun.com/20925_o.jpg?_=4021689%22%20style=%22border:none;max-width:1128px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.44275509053841233',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="border-style: none; border-width: initial; width: 418px; height: 200px;">

雙圈的表示終態,這個是怎麼來的呢。去看看圖4,會發現有些項之前有雙圈標誌,這個是因爲在NFA圖2中,9爲終態,所以所有包含9的集合都被認爲是終態集,改成1.2.3.。。方便畫節點後就需要把這些點作爲終態了。。

三.最小化,分割法。

FA的最小化就是尋求最小狀態DFA

最小狀態DFA的含義: 
1.沒有多餘狀態(死狀態)

image 

除多餘狀態 
什麼是多餘狀態? 
從這個狀態沒有通路到達終態;S1 
從開始狀態出發,任何輸入串也不能到達的那個狀態。S2 
如何消除多餘狀態? 
刪除

2. 沒有兩個狀態是互相等價(不可區別) 
兩個狀態s和t等價的條件: 
兼容性(一致性)條件——同是終態或同是非終態 
傳播性(蔓延性)條件——對於所有輸入符號,狀態s和狀態t必須轉換到等價的狀態裏。。

DFA的最小化—例子,第一步都是固定的。分成終態和非終態

1.將M的狀態分爲兩個子集一個由終態k1={C,D,E,F}組成,一個由非終態k2={S,A,B}組成,

2.考察{S,A,B}是否可分.

id="iframe_0.9433854855597019" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://leaverimage.b0.upaiyun.com/20927_o.jpg?_=4021689%22%20style=%22border:none;max-width:1128px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.9433854855597019',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="border-style: none; border-width: initial; width: 456px; height: 153px;">

因爲A經過a到達C屬於k1.而S經過a到達A屬於k2.B經過a到達A屬於k2,所以K2繼續劃分爲{S,B},{A},

3.考察{S,B}是否可再分:

B經過b到達D屬於k1.S經過b到達B屬於k2,所以S,B可以劃分。劃分爲{S},{B}

4.考察{C,D,E,F}是否可再分: 
因爲C,D,E,F經過a和b到達的狀態都屬於{C,D,E,F}=k1所以相同,所以不可再分:

5.{C,D,E,F}以{D}來代替則,因爲CDEF相同,你也可以用C來代替。無所謂的最小化的DFA如圖,: 
id="iframe_0.16645657899789512" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://leaverimage.b0.upaiyun.com/20928_o.jpg?_=4021689%22%20style=%22border:none;max-width:1128px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.16645657899789512',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="border-style: none; border-width: initial; width: 221px; height: 126px;">

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章