確定型有窮自動機是不確定有窮自動機中的乙個特例,其中:
沒有輸出ε之上的轉換動作。
對每個狀態s和每個輸入符號a,有且只有一條標號為a的邊離開s
下面來看看nfa怎麼轉換為dfa吧
先來看看一會會涉及到操作
以下為演算法
看完演算法可能還是有些懵逼,我們一起來過一遍例項。以下圖為例。
先構建乙個這樣的**
然後從起始態出發,做空串的kleene閉包,得到,填入nfa的第一行,dfa此時命名為a(或數字1,甚至是α都可以),然後對這個得到的閉包做 move(a)操作,即用這個閉包的所有狀態去匹配a,可以得到,發現是乙個全新的狀態,填到nfa的第二行,給其dfa命名為b,然後在a下填入b。
然後還是用a去做 move(b) 操作,得到全新閉包,例如nfa第三行,稱其為c,在b的第一行填入c。至此,得到下表
然後再對b做 move(a)和 move(b)操作,得到
操作c得到
操作d得到
操作e得到,此時發現舊狀態全部處理完,且沒有出現新狀態。那麼我們的dfa就求完了。
將狀態表轉換為狀態圖(這裡需要注意,a為第乙個起始狀態,所以a為起始態。由於e包含接收態10,故e為接收態),整個轉換過程就全部結束了。這個方法我們稱其為子集構造法
對於同乙個語言,可以存在多個識別此語言的dfa,所以,求出dfa後,通常我們還需要對dfa進行簡化操作,求出最簡dfa。
簡化的本質是合併性質相同的狀態,以減少整個圖的大小。
將得到的狀態進行劃分 ∏ ,劃分為兩部分,一部分為接收態,一部分為為非接收態組。
繼續進行劃分,通過其可以匹配的字元進行判斷,若該組內所有成員匹配字元都落在同一組內,即不可再分,否則重新劃分組
若 ∏new = ∏ ,則進入步驟4,否則返回2
在分組 ∏new 每個組中選取乙個狀態作為代表,代表dfa的最簡狀態。
直接用上圖轉換出來的dfa來做。
分組,得到
獨自分組,無法操作。 做a操作,發現都轉為狀態b,做b操作,a,b,c在 組內成員,而d在另乙個組內,重新分組得到
無法操作, 做a操作,都在同一組內,做b操作,b不在同一組內,重新劃分,重新分組得到
進行a操作和b操作都在同一組內,無法繼續向下劃分了。操作到此結束。可以將 合併
得到以下轉換表
轉換為狀態圖後
至此我們nfa轉dfa及dfa的簡化全部完成了。
NFA到DFA的轉換
include include include include include include define max 100 using namespace std struct edge struct newj 得到的狀態集合 struct relation 集合和集合之間的轉換聯絡 void g...
NFA到DFA的轉換
又稱nfa的確定化 狀態轉換表 注 標有 為接收狀態 帶 邊記得增加一列 nfa的開始狀態集合為 0 將nfa將接收的符號代入當前狀態,最長子串原則,得出新產生的狀態 將新產生的狀態作為將來要列出的狀態重複1中步驟 直至新產生的狀態集合中無新集合時結束 將第一列中將來要列的狀態重新命名 轉換為dfa...
NFA到DFA的轉換演示
複習一下編譯,在龍書中提到的nfa 不確定有窮自動機 到dfa 確定有窮自動機 的轉換,master regular expression中提到的不依賴於正規表示式的識別問題,不用精心構造正規表示式,只需將正規表示式轉化為nfa,進而轉化為dfa,則任何長度為n的字串都可以在o n 時間內判斷出來是...