• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            twzheng's cppblog

            『站在風口浪尖緊握住鼠標旋轉!』 http://www.cnblogs.com/twzheng

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              136 隨筆 :: 78 文章 :: 353 評論 :: 0 Trackbacks
            [源] http://www2.gdin.edu.cn/jkx/webstudy/bianyiyuanli/fornpage/chapter03/section3/03.3.3.htm

            不確定的有窮自動機N的確定化
              根據定義,顯然DFA是NFA的特例。對于每個NFA M,存在一個DFA M′,使得 L(M)=L(M′)。
              對于任何兩個有窮自動機M和M′,如果L(M)=L(M′),則稱M與M′是等價的。
              我們將介紹一種算法,對于給定的NFA M,構造其等價的DFA M′。
              請你注意這個結論:DFA是NFA的特例
              對每個NFA N一定存在一個DFA M,使得L(M)=L(N)。對每個NFA N存在著與之等價的DFA M。與某一NFA等價的DFA不唯一。
              在有窮自動機的理論里,有這樣的定理:設L為一個由不確定的有窮自動機接受的集合,則存在一個接受L的確定的有窮自動機。我們不對定理進行證明,只介紹一種算法(這種算法稱為子集法),將NFA轉換成接受同樣的語言的DFA。
              為什麼對DFA如此親睞呢?因為它的行為很容易用程序來模擬。
              DFA M=(K,Σ,f,S,Z)的行為的模擬程序
            程序段    K:=S;
               c:=getchar;
               while c<>eof do
                {K:=f(K,c);
                 c:=getchar;
                };
               if K is in Z then return (‘yes’)
                else return (‘no’)
              從NFA的矩陣表示中可以看出,表項通常是一個狀態的集合,而在DFA的矩陣表示中,表項是一個狀態,NFA到相應的DFA的構造的基本想法是該DFA的每一個狀態對應NFA的一組狀態。該DFA使用它的狀態去記錄在NFA讀入一個輸入符號后可能達到的所有狀態。也就是說,在讀入輸入符號串a1a2…an之后,該DFA處在這樣一個狀態,該狀態表示這個NFA的狀態的一個子集T,T是從NFA的開始狀態沿著某個標記為a1a2…an的路徑可以到達的那些狀態。
              為介紹算法首先定義對狀態集合I的幾個有關運算:
              1. 狀態集合I的ε-閉包,表示為ε-closure(I),定義為一狀態集,是狀態集I中的任何狀態S經任意條ε弧而能到達的狀態的集合。
              回顧在前面章節對轉換函數的擴充:如輸入字符是空串,則自動機仍停留在原來的狀態上,顯然,狀態集合I的任何狀態S都屬于ε-closure(I)。
              2. 狀態集合I的a弧轉換,表示為move(I,a),定義為狀態集合J,其中J是所有那些可從I中的某一狀態經過一條a弧而到達的狀態的全體。
              我們使用圖4.4的NFA N的狀態集合來理解上述兩個運算。
            圖 4.4 NFA N
              ε-closure(0)={0,1,2,4,7}
              即{0,1,2,4,7}中的任一狀態都是從狀態0經任意條ε弧可到達的狀態,令{0,1,2,4,7}=A,則 move(A,a)={3,8},因為在狀態0,1,2,4和7中,只有狀態2和7有a弧射出,分別到達狀態3和8。
              而ε-closure({3,8})={1,2,3,4,6,7,8}。

              再看一個例子,對下圖所示NFA的狀態集合I的運算
            圖 4.5
              I={1},ε-closure(I)={1,2};
              I={5},ε-closure(I)={5,6,2};
              move({1,2},a)={5,3,4}
              ε-closure({5,3,4})={2,3,4,5,6,7,8};

              NFA確定化算法:假設NFA N=(K, ∑,f,K0,Kt)按如下辦法構造一個DFA M=(S, ∑,d,S0,St),使得L(M)=L(N):
              ① M的狀態集S由K的一些子集組成(k的子集構造算法見下頁)。用[S1 S2... Sj]表示S的元素,其中S1, S2,,... Sj是K的狀態。并且約定,狀態S1, S2,,... Sj是按某種規則排列的,即對于子集{S1, S2}={ S2, S1,}來說,S的狀態就是[S1 S2];
              ② M和N的輸入字母表是相同的,即是∑;
              ③ 轉換函數是這樣定義的:
              d([S1 S2,... Sj],a)= [R1R2... Rt] 其中 {R1,R2,... , Rt} = e-closure(move({S1, S2,,... Sj},a))
              ④ S0=e-closure(K0)為M的開始狀態;
              ⑤ St={[Si Sk... Se],其中[Si Sk... Se]∈S且{Si , Sk,,... Se}∩Kt≠φ}

            構造NFA N的狀態K的子集的算法:
              假定所構造的子集族為C,即C= (T1, T2,,... TI),其中T1, T2,,... TI為狀態K的子集。
            ① 開始,令e-closure(K0)為C中唯一成員,并且它是未被標記的。
            ② while (C中存在尚未被標記的子集T)do {
              標記T;
              for 每個輸入字母a do
              {
               U:= e-closure(move(T,a));
                if U不在C中 then
                將U作為未標記的子集加在C中
              }
             }
            例題 例 3.3 應用左面的算法對圖4.4的NFA N構造子集,步驟如下:
                ① 首先計算ε-closure(0),令T0=ε-closure(0)={0,1,2,4,7},T0未被標記,它現在是子集族C的唯一成員。
              ② 標記T0;令T1=ε-closure(move(T0,a))={1,2,3,4,6,7,8},將T1加入C中,T1未被標記。
              令T2=ε-closure(move (T,b))={1,2,4,5,6,7},將T2加入C中,它未被標記。
              ③ 標記T1;計算ε-closure(move(T1,a)),結果為{1,2,3,4,6,7,8},即T1,T1已在C中。
              計算ε-closure(move(T1,b)),結果為{1,2,4,5,6,7,9},令其為T3,T3加至C中,它未被標記。
              ④ 標記T2,計算ε-closure(move(T2,a)),結果為{1,2,3,4,6,7,8},即T1,T1已在C中。
              計算ε-closure(move(T2,b)),結果為{1,2,4,5,6,7},即T2,T2已在C中。
              ⑤ 標記T3,計算ε-closure(move(T3,a)),結果為{1,2,3,4,6,7,8},即T1
              計算ε-closure(move(T3,b)),結果為{1,2,4,5,6,7,10},令其為T4,加入C中,T4未被標記。
              ⑦ 標記T4,計算ε-closure(move(T4,a)),結果為{1,2,3,4,6,7,8},即T1
              計算ε-closure(move(T4,b))結果為{1,2,4,5,6,7},即T2
              至此,算法終止共構造了五個子集:
              T0={0,1,2,4,7} T1={1,2,3,4,6,7,8}
              T2={1,2,4,5,6,7} T3={1,2,4,5,6,7,9}
              T4={1,2,4,5,6,7,10}
              那么圖4.4的NFA N構造的DFA M為
              ① S={[T0],[T1],[T2],[T3],[T4]}
              ② Σ={a,b}
              ③ D([T0],a)=[T1] D([T2],a)=[T1]
                D([T0],b)=[T2] D([T2],b)=[T2]
                D([T1],a)=[T1] D([T3],a)=[T1]
                D([T1],b)=[T3] D([T3],b)=[T4]
                D([T4],a)=[T1]
                D([T4],b)=[T2]
              ④ S0=[T0]
              ⑤ St=[T4]
              不妨將[T0],[T1],[T2],[T3],[T4]重新命名,以利于書寫,或用A,B,C,D,E或用0,1,2,3,4分別表示。若采用后者,該DFA M的狀態轉換圖如圖4.6所示。
            圖 4.6 DFA M
             
            又例:將下圖的NFA確定化
            劃分子集及重新命名:
            Ia Ib
            {i,1,2} S {1,2,3} A {1,2,4} B
            {1,2,3} A {1,2,3,5,6,f} C {1,2,4} B
            {1,2,4} B {1,2,3} A {1,2,4,5,6,f} D
            {1,2,3,5,6,f} C {1,2,3,5,6,f} C {1,2,4,6,f} E
            {1,2,4,5,6,f} D {1,2,3,6,f} F {1,2,4,5,6,f} D
            {1,2,4,6,f} E {1,2,3,6,f} F {1,2,4,5,6,f} D
            {1,2,3,6,f} F {1,2,3,5,6,f} C {1,2,4,6,f} E
            確定化后的自動機:
            posted on 2007-04-03 22:20 譚文政 閱讀(1859) 評論(1)  編輯 收藏 引用 所屬分類: 基礎知識

            評論

            # re: 不確定的有窮自動機N的確定化 2011-05-12 09:44 歸地方
            圖片失效鳥  回復  更多評論
              

            欧美日韩精品久久免费| av无码久久久久久不卡网站| 狠狠综合久久综合中文88| 日韩精品无码久久一区二区三| 久久久久国产视频电影| 99久久国产精品免费一区二区| 色88久久久久高潮综合影院| 久久精品男人影院| 无码人妻久久一区二区三区蜜桃 | 久久综合五月丁香久久激情| 亚洲国产小视频精品久久久三级| 中文字幕乱码久久午夜| 久久香蕉一级毛片| 国产精品久久久香蕉| 99久久精品日本一区二区免费| 亚洲国产成人久久笫一页| 日本免费一区二区久久人人澡 | 精品午夜久久福利大片| 婷婷久久综合九色综合绿巨人| 久久久久久亚洲精品成人| 久久久久久A亚洲欧洲AV冫 | 亚洲国产精品嫩草影院久久| 亚洲AV无码久久精品成人| 亚洲精品NV久久久久久久久久| 精品一区二区久久久久久久网站| 77777亚洲午夜久久多人| 天堂无码久久综合东京热| 久久久久亚洲AV无码专区桃色 | 久久婷婷国产麻豆91天堂| 人妻无码久久一区二区三区免费| 亚洲人成无码网站久久99热国产| 91精品观看91久久久久久| 亚洲精品乱码久久久久久按摩| 久久中文字幕人妻熟av女| 亚洲精品午夜国产va久久 | 久久综合九色综合网站| 伊人 久久 精品| 国内精品久久久久影院薰衣草| 亚洲中文久久精品无码| 久久香综合精品久久伊人| AV色综合久久天堂AV色综合在|