從正則表達式到 NFA 到 DFA 到最簡 DFA (三)(結束)


從正則表達式到 NFA 到 DFA 到最簡 DFA (三)

DFA $ \rightarrow $ 最簡 DFA (Hopcroft 算法)

這是一個基於等價類的算法。

split(S)
    foreach char c
        if c 能切分 S
            split S into T1, T2, ..., TK
hopcroft()
    split all nodes into N, A(即非接收狀態和接收狀態)
    while (set is still changing)
        split(N/A)

這里的等價類,通俗來說就是根據某些特征來划分狀態。比如某些狀態,都是接收狀態,就可以被分為一類。某些狀態都是非接收狀態,它們就是一類。然后再看每一類中是否還可以繼續被划分,比如某些狀態經過一次轉移可以到接收狀態,有些狀態不可以,那么這兩種狀態就是不同的,可以繼續分類。

例1

按照接收狀態非接收狀態划分,q0 單獨一類,q1 q2 q3 是一類。因為 b 和 c 無法區分 q1 q2 q3 中的狀態,所以這一個集合(q1, q2, q3)收縮成 q4。

例2

首先,{q0, q1, q2, q4} → N,{q3, q5} → A。

然后在 N 上看各個狀態接收字符 e 之后的轉移,q2 和 q4 都可以轉移到 A 集合中,而 q0 和 q1 不行,所以再次分類:{q2, q4} → N1,{q0, q1} → N2。

在 N1 和 A 上看各個狀態接收各個字符后的轉移,發現無法繼續划分,所以這就是一個最簡狀態集了。

在 N2 上看各個狀態接收各個字符后的轉移,發現接收字符 e 時,q1 可以轉移到 N1,而 q0 不行。所以再次划分 N1:{q1} → N21,{q0} → N22。

再看各個狀態集,都不可以被繼續划分了。此時到達最簡 DFA。


免責聲明!

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



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