DFA 、NFA、 \(\varepsilon-NFA\) 的等價性
這三種自動機定義的語言是同一種語言,都是正規語言
DFA定義的語言可以被NFA接受;NFA定義的語言可以被DFA接受
每一個NFA都能轉化為等價的DFA
每個DFA都是NFA的特例
如何將一個NFA轉化為DFA
觀察:NFA中每一個狀態映射為一個狀態子集
IDEA: 每個狀態子集映射為單一的DFA狀態 (子集構造方法 subset construction theory)
包含原來狀態中終止狀態的狀態定義為新的終止狀態
有了原始的NFA的狀態,構造的對應的DFA的子集狀態可能有\(2^n\)個。所以我們可以把所有的可能狀態列出來,然后連線就可以了。看看每一個狀態都有可能去哪些狀態。反正所有的狀態已經列出來了。。。(妙!!!)
記得最后判定這些列出來的子集含不含終止狀態!!!
使得每一個NFA的狀態子集DFA都有唯一的狀態與之對應
注意:有時候對於所有已經划分好的NFA狀態子集進行連線時發現,會有一些狀態不可達,也就是這些狀態與其他狀態彼此孤立。因此需要刪除不可達狀態。也就是下面所示:
刪除不需要的(不可達)狀態,然后就得到真正的DFA,上圖完了還得標上終止狀態。
NFA到DFA的子集構造算法描述
算法總結:
- 枚舉所有的可能子集
- 確定具體的遷移
- 僅保留從{q0}出發的可達狀態
最后可以對狀態集合命名,比如上面的\(\{q_0\}\)命名成A
但是當狀態數比較大的時候,比如狀態數為10,那么是不是意味着要生成\(2^{10}\)個子集合,但是最終卻要刪去這\(2^{10}\) 中的絕大多數。感覺白白創建,白白浪費資源
優化方法:
為避免枚舉冪集,采用"惰性創建狀態的方法"。
其實就是不經過上面圖中中間表格,而是由第一個表格直接生成具有可達狀態的第三個表格,省去了中間巨量無用冪集的創建。直接生成最后有用的可達狀態
惰性創建(動態創建)法
本着按需引進 的目的
不清楚表格一共有多少行,我們一行一行分析。這就和子集構造法不一樣了,子集構造法是一下子把這個表有多少行,每一行是什么都先知道,然后連線的
拿着剛開始的初始狀態,一行一行往下進行;當有新狀態產生的時候,把這個新產生的狀態添加到我們需要確定的可達狀態子集 ,一直到沒有新狀態產生。
隨着處理過程,需要引進狀態,我們再引進。
這個動態構造算法比子集構造法要好。節省時間、空間、還不用刪去不可達狀態。實驗課推薦這個方法!!!
定理:由NFA通過子集構造法或者動態構造法得到的DFA,和我們原來的NFA,這兩個自動機是等價的,有\(L(DFA)=L(NFA)\)
證明過程可以由歸納法。也就是前面講的擴展轉移函數 和 **串=串+一個字符 **
但是!!! 我們也有這個擔憂 一般來說DFA的狀態數要比NFA大得多
\(\varepsilon-NFA\) (不接受符號自由轉移)
其實,\(\varepsilon\)就是不接受任何字符可以轉換狀態的。\(\varepsilon\)增加了狀態機的靈活性
感覺有個\(\varepsilon\)被接受的概率顯著增大了,幾乎能從40%到93%!!!,就是這么神乎其神
超級靈活,但是也有不接受的,比如上面的11,還是不能接受
例題:構造NFA,接受這樣一個串,偶數個0或者奇數個1。(兩個自動機用\(\varepsilon\)連接就行) 就是用來處理OR的
帶\(\varepsilon\) 的NFA就是做題方便,還是幫助人理解、思考。正真在計算機中處理,還是要變成DFA。 可以先知道帶\(\varepsilon\) 的NFA與DFA處理能力是一樣的
只有DFA是面向機器的,NFA、\(\varepsilon\) -NFA是面向人的(或者說是面向做題的(滑稽!)) 最終在機器中都得落實到DFA中。但是一般問題也不是說不能用DFA做,是可以做的,就是比較麻煩!!!
由於\(\varepsilon\) 弧比較自由,因此引入團或者叫閉包的概念。就是說它們非常相似,是一伙的。
\(\varepsilon\) -cloure of a state q 我們也叫做 E-CLOURE(q).就是q狀態通過\(\varepsilon\)連接起來的那些狀態的集合
將\(\varepsilon\) -NFA刪減到DFA
消除\(\varepsilon\) 有如下幾個規則
- 通過\(\varepsilon\) 能夠到達最終狀態的狀態 都是最終狀態
- 通過一個終結符前前后后有多個\(\varepsilon\) ,可以將這些合並成最后只有一個終結符 \(\varepsilon\)\(\varepsilon\)\(\varepsilon\) a\(\varepsilon\)\(\varepsilon\)\(\varepsilon\)\(\varepsilon\) -> a
算法思想:\(\varepsilon\)-NFA 轉化成 NFA 再轉化成 DFA
\(\varepsilon\)-NFA =NFA = DFA 三者的功能是一樣的
證明略
都是接受正規語言RE