有限狀態自動機 正規表示式

2021-05-25 02:41:05 字數 3395 閱讀 3656

將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), 並設定狀態為未標記;

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

ε-closure(t)的計算方法如下:

將t中的所有狀態入棧;

設定ε-closure(t)的初始值為t;

while 棧非空 do

begin

從棧頂取出元素t;

for 從t出發以ε為邊能夠到達的各個狀態u do

if u不在ε-closure(t)中 then

begin

將u追加到ε-closure(t)中;

將u入棧;

endend

將上面生成的nfa轉化為dfa。

最初,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交給我乙個點燈的任務 大意是乙個玩意單擊的時候如何如何,長按又如何如何,雙擊又如何如何,幾種狀態分別執行不同的操作。這就導致了一種情況 在機器第一次檢測到按鈕被按下時,我們無法做出論斷 我們不知道這是一次雙擊還是長按還是單擊,我們只能靜觀其變,見機行事。但是按鈕被按下時,...