NFA與DFA之間的轉化


利用子集法,可以將NFA轉化為與之等價的DFA。

記狀態機$A$為 $$A = ( V,\sum,\delta,V_{N},V_{T} )$$

$\epsilon \_CLOSURE$的求法

假設我們要構造狀態$I$的$\epsilon$_閉包,即$\epsilon \_CLOSURE(I)$。

基礎:$I \in \epsilon \_CLOSURE(I)$。

歸納:如果$s_i \in \epsilon \_CLOSURE(I)$,且存在$\delta(s_i,\epsilon) = s_j$,則$s_j \in \_CLOSURE(I)$。

子集法確定化NFA的步驟

(1)構造一張轉換表,其第一列為狀態子集$I$,對不同的$a \ (a \in \sum)$ 在表單中設一列$I_{a}$。

(2)表的第一行第一列其狀態子集$I$為$\epsilon \_CLOSURE(V_{T})$,其中$V_{T}$為初始狀態。

(3)根據第一列中的$I$,為每一個$a$求其$I_{a}$,並記入對應的$I_{a}$列中,並且對該狀態子集求$\epsilon \_CLOSURE$,如果此$I_{a}$不同與第一列中已存在的所有狀態子集$I$,則將其記入到空行的第一列。

(4)重復步驟(3),直到每個$I$及$a$,均已求得$I_{a}$,並且無新的狀態子集$I_{a}$加入第一列為止。

(5)重新命名第一列的每一個狀態子集,則轉換為新的狀態轉移矩陣。

 

下面是一個NFA,並且將NFA轉為DFA

 

下面是轉化過程

對第一列進行編號,形成新的DFA狀態,然后根據上面的狀態轉移矩陣畫圖。

為什么子集構造法是正確的

這里可知,DFA識別字符串返回的是一個狀態,而NFA識別字符串是返回一個狀態集合。

由上面的步驟可知,子集構造法是將NFA識別的狀態集合作為DFA的一個狀態,所以NFA能識別的字符串,DFA照樣能夠識別,所以子集構造法是行之有效的。

下面給出形式化的證明

對於字符串$w$

要證明的只是對於$\delta_{D}(\epsilon\_CLOSURE(V_{T}),w) = \delta_{N}(V_{T},w)$

$\delta_{D}$是DFA的轉移函數  , $ \delta_{N}$是NFA的轉移函數

即從初始狀態開始,對於任意的字符串$w$,它們識別的情況是一樣的。

基礎:設$|w|=0$,即$w=\epsilon$,那么可知,$\delta_{D}(\epsilon\_CLOSURE(V_{T}),\epsilon) 和 \delta_{N}(V_{T},\epsilon)$都是$\epsilon\_CLOSURE(V_{T})$。

歸納:設$w$的長度為$n+1$,假設命題對長度$n$成立。把$w$分解成$w=xa$。$a$是字符串w的最后一個字符

那么根據假設, 有 $\delta_{D}(\epsilon\_CLOSURE(V_{T}),x) = \delta_{N}(V_{T},x)$。設這兩個狀態集合都是$\{ p_1,p_2,...,p_k \}$

那么NFA識別字符串$w$所得到的狀態集合是$$\delta_{N}(V_T,w) = \bigcup_{i=1}^{k} \delta_N(p_i,a)$$

而DFA識別字符串$w$所得到的狀態集合是$$\delta_D({p_1,p_2,...,p_k},a)=\bigcup_{i=1}^{k}\delta_D(p_i,a)$$

可知$$\delta_D({p_1,p_2,...,p_k},a)= \bigcup_{i=1}^{k} \delta_N(p_i,a)$$

所以,$$\delta_D({p_1,p_2,...,p_k},a) = \bigcup_{i=1}^{k} \delta_N(p_i,a)$$

所以得到了$L(D)=L(N)$的證明。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM