1. 程式人生 > >如何將 不確定的有窮自動機(NFA) 轉化為 確定的有窮自動機(DFA)

如何將 不確定的有窮自動機(NFA) 轉化為 確定的有窮自動機(DFA)

ima 有一個 str 入棧 出發 一個 初始化 dstat 所有

一、從NFA到DFA的轉換

例如下圖:

技術分享圖片

DFA的每個狀態都是一個由NFA中的狀態構成的集合,即NFA狀態集合的一個子集

技術分享圖片

r =aa*bb*cc*

技術分享圖片

二、從帶有ε-邊的NFA到DFA的轉換

技術分享圖片

r=0*1*2*

技術分享圖片

技術分享圖片

三、子集構造法( subset construction)

? 輸入:NFA N
? 輸出:接收同樣語言的DFA D
? 方法:一開始,ε-closure ( s0 )是Dstates 中的唯一狀態,且它未加標記;

while(在Dstates中有一個未標記狀態T )
{
    給T加上標記;
    for(每個輸入符號a)
    {
        U = ε-closure(move(T, a));
        
if ( U不在Dstates中) 將U加入到Dstates中,且不加標記; Dtran[T, a]=U ; } }

技術分享圖片

四、計算 ε-closure (T )

將T的所有狀態壓入stack中;將ε-closure (T )初始化為 T ;

 while(stack非空)
{
  將棧頂元素 t 給彈出棧中;
  for(每個滿足如下條件的u :從t出發有一個標號為ε的轉換到達狀態u)
     if ( u不在ε-closure  (T )中)
    {
      將u加入到ε-closure  (T )中;將u壓入棧中;
    }
}

如何將 不確定的有窮自動機(NFA) 轉化為 確定的有窮自動機(DFA)