將nfa轉化為dfa
nfa和dfa的效率
記號有字母表中的符號組成的有限長度的序列。記號s的長度記為|s|。 長度為0的記號稱為空記號,記為ε。
有限自動機(finite state automaton)
為研究某種計算過程而抽象出的計算模型。 擁有有限個狀態,根據不同的輸入每個狀態可以遷移到其他的狀態。
非確定有限自動機(nondeterministic finite automaton)
簡稱nfa,由以下元素組成:
1. 有限狀態集合
s;2. 有限輸入符號的字母表
σ;3. 狀態轉移函式
move;
4. 開始狀態
ssub;
5. 結束狀態集合
f,f ∈ s。
自動機初始狀態為
ssub,逐一讀入輸入字串中的每乙個字母,根據當前狀態、讀入的字母, 由狀態轉移函式
move控制進入下乙個狀態。如果輸入字串讀入結束時自動機的狀態屬於結束狀態集合
f, 則說明該自動機接受該字串,否則為不接受。
確定有限自動機(deterministic finite automaton)
簡稱dfa,是nfa的一種特例, 有以下兩條限制:
1. 對於空輸入
ε,狀態不發生遷移;
2. 某個狀態對於每一種輸入最多只有一種狀態轉移。
演算法1將正規表示式轉換為nfa(thompson構造法)
輸入字母表σ上的正規表示式r
輸出能夠接受l(r)的nfa n
方法首先將構成r的各個元素分解,對於每乙個元素,按照下述規則1和規則2生成nfa。注意:如果r中記號a出現了多次,那麼對於a的每次出現都需要生成乙個單獨的nfa。
之後依照正規表示式r的文法規則,將生成的nfa按照下述規則3組合在一起。
規則1對於空記號ε,生成下面的nfa。
規則2對於σ的字母表中的元素a,生成下面的nfa。
規則3令正規表示式s和t的nfa分別為n(s)和n(t)。
a) 對於s|t,按照以下的方式生成nfa n(s|t)。
b) 對於st,按照以下的方式生成nfa n(st)。
c) 對於s*,按照以下的方式生成nfa n(s*)。
d) 對於(s),使用s本身的nfa n(s)。
演算法1生成的nfa能夠正確地識別正規表示式,並且具有如下的性質:
n(r)的狀態數最多為r中出現的記號和運算子的個數的2倍。
n(r)的開始狀態和結束狀態有且只有乙個。
n(r)的各個狀態對於σ中的乙個符號,或者擁有乙個狀態遷移,或者擁有最多兩個ε遷移。
利用演算法1,根據正規表示式 r=(a|b)*abb 可以生成以下的nfa。
使用以下的演算法可以將nfa轉換成等價的dfa。
演算法2將nfa轉化為dfa
輸入nfa n
輸出能夠接受與n相同語言的dfa d
方法本演算法生成d對應的狀態遷移表dtran。dfa的各個狀態為nfa的狀態集合, 對於每乙個輸入符號,d模擬n中可能的狀態遷移。
定義以下的操作。
操作說明
ε-closure(s)
從nfa的狀態s出發,僅通過ε遷移能夠到達的nfa的狀態集合
ε-closure(t)
從t中包含的某個nfa的狀態s出發,僅通過ε遷移能夠到達的nfa的狀態集合
move(t, a)
從t中包含的某個nfa的狀態s出發,通過輸入符號a遷移能夠到達的nfa的狀態集合
令 dstates 中僅包含ε-closure(s), 並設定狀態為未標記;ε-closure(t)的計算方法如下:while dstates中包含未標記的狀態t do
begin
標記t;
for 各輸入記號a do
begin
u := ε-closure(move(t, a));
if u不在dstates中 then
將 u 追加到 dstates 中,設定狀態為未標記;
dtrans[t, a] := u;
endend
將t中的所有狀態入棧;將上面生成的nfa轉化為dfa。設定ε-closure(t)的初始值為t;
while 棧非空 do
begin
從棧頂取出元素t;
for 從t出發以ε為邊能夠到達的各個狀態u do
if u不在ε-closure(t)中 then
begin
將u追加到ε-closure(t)中;
將u入棧;
endend
最初,dstates內僅有ε-closure(0) = a = 。然後對於狀態a,對於輸入記號a,計算 ε-closure(move(a, a)) = ε-closure(move(, a)) = ε-closure() = , 即 b=, dtran[a, a]=b。 對於狀態a,由輸入記號b能夠到達的僅有4->5,因此 c = ε-closure() = , 即dtran[a, b] = c。
以此類推,可得到以下的狀態和dtran。
a = d =狀態b = e =
c =
輸入符號ab
abcb
bdcb
cdbe
ebc
由此得出dfa如下圖所示。
給定正規表示式r和輸入記號序列x,判斷r是否能夠接受x。
使用nfa的情況下, 由正規表示式生成nfa的時間複雜度為o(|r|),另外由於nfa的狀態數最多為r的2倍,因此空間複雜度為o(|r|)。 由nfa判斷是否接受x時,時間複雜度為o(|r|×|x|)。因此,總體上處理時間與 r、x的長度之積成比例。 這種處理方法在x不是很長時十分有效。
如果使用dfa,由於利用dfa判斷是否接受x與狀態數無關,因此時間複雜度為o(|x|)。但是dfa的狀態數 與正規表示式的長度呈指數關係。例如,正規表示式(a|b)*a(a|b)(a|b)...(a|b),尾部有 n-1 個 (a-b)的話, dfa最小狀態數也會超過 2sup。
有限狀態自動機
有限自動機是更一般化的狀態轉化圖。分為確定有限自動機 dfa 和不確定有限自動機 nfa m s,f,so,z 其中 下圖為乙個確定的有限狀態自動機 m s,f,so,z 其中 下圖為乙個不確定的有限狀態自動機 說了半天其實它們的本質區別就在於s0,確定的有限狀態自動機的s0是唯一確定的。而不確定的...
有限狀態自動機
有限自動機是更一般化的狀態轉化圖。分為確定有限自動機 dfa 和不確定有限自動機 nfa m s,f,so,z 其中 下圖為乙個確定的有限狀態自動機 m s,f,so,z 其中 下圖為乙個不確定的有限狀態自動機 說了半天其實它們的本質區別就在於s0,確定的有限狀態自動機的s0是唯一確定的。而不確定的...
有限狀態自動機
背景提要 星期三的時候,xw交給我乙個點燈的任務 大意是乙個玩意單擊的時候如何如何,長按又如何如何,雙擊又如何如何,幾種狀態分別執行不同的操作。這就導致了一種情況 在機器第一次檢測到按鈕被按下時,我們無法做出論斷 我們不知道這是一次雙擊還是長按還是單擊,我們只能靜觀其變,見機行事。但是按鈕被按下時,...