1. 程式人生 > >編譯原理(二) NFA的確定化及DFA的最小化

編譯原理(二) NFA的確定化及DFA的最小化

1. NFA的確定化

1.1. 明確NFA的定義

一個非確定的有窮自動機(NFA)M是一個五元式:

  • M=(S,,δ,S0,F)
    • S
    • δS×Sδ:S×2S
    • S0S,
    • F S , 是一個終態集(可空)

1.2. 定義運算

定義對狀態集合I的幾個有關運算:

  • 狀態集合I的ε-閉包,表示為ε-closure(I),定義為一狀態集,是狀態集I中的任何狀態s經任意條ε弧而能到達的狀態的集合。狀態集合I的任何狀態s都屬於ε-closure(I)。
  • 狀態集合I的a弧轉換,表示為move(I,a)定義為狀態集合J,其中J是所有那些可從I的某一狀態經過一條a弧而到達的狀態的全體。
    定義Ia = ε
    -closure(move(I,a))

1.3. 演算法描述

  • 每次從隊頭取出一個集合,(開始佇列內只有初態集合I的ε-閉包(I) ),然後得到它對於任意一個字元a的Ia=εclosure(move(I,a))
  • 然後如果當前狀態之前沒有出現過,那麼當前狀態作為一個新的狀態I,放入佇列。
  • 一直做如上操作,直到佇列為空

2. DFA的最小化

2.1. 明確DFA的定義

一個確定的有窮自動機(DFA)M是一個五元式:

  • M=(S, ∑, δ, s0, F)其中
    • S是一個有限集,它的每個元素稱為一個狀態。
    • ∑是一個有窮字母表,它的每個元素稱為一個輸入字元
      -δ是一個從S×∑至S的單值對映。δ(s,a)=s’意味著:當現行狀態-為s、輸入字元為a時,將轉換到下一個狀態s’。我們稱s’為s的一個後繼狀態。
    • s0∈S,是唯一的初態。
    • F S,是一個終態集(可空)

2.2 演算法描述

  • DFA M =(K,∑,f, k0,, kt),最小狀態DFA M’
    • 1.構造狀態的初始劃分0:終態kt 和非終態K- kt兩組
    • 2.對∏施用傳播性原則 構造新劃分new
    • 3.如new=,則令new=並繼續步驟4,否則:=new重複2
    • 4.為final中的每一組選一代表,這些代表構成M’的狀態。若k是一代表且f(k,a)=t,令r是t組的代表,則M’中有一轉換f’(k,a)=r M’ 的開始狀態是含有K0的那組的代表 M’的終態是含有Kt的那組的代表
    • 5.去掉M’中的死狀態.