DFA確定有限狀態自動機
阿新 • • 發佈:2019-01-09
ima 現狀 i++ bubuko 英語 stat mini 否則 lse
DFA
在計算理論中,確定有限狀態自動機或確定有限自動機(英語:deterministic finite automaton, DFA)是一個能實現狀態轉移的自動機。對於一個給定的屬於該自動機的狀態和一個屬於該自動機字母表Σ的字符,它都能根據事先給定的轉移函數轉移到下一個狀態(這個狀態可以是先前那個狀態)。
可以通過建立狀態機來解決問題。
每次輸入都會引起狀態的改變或者不變。再次輸入一個值,狀態又會改變。
我們把所有狀態羅列出來,每次輸入都改變他的狀態。如果最後的狀態是合法的,那麽證明這個輸入符合條件。
例題
一個僅有ab的字符串,要求b需要成對出現,否則不合法。就是(a|bb)*
正則的匹配。我們可以用dfa來做這個題。
我們可以通過要求生成這樣一個自動機:
字符串一共有3種狀態,分別是沒有b的狀態或者b合法的狀態,“a”,只有一個b的臨時狀態“ab”,b不匹配的“aba”狀態。
- 沒有輸入的時候處於狀態1,當輸入一個a的時候還是處於狀態1。
- 當輸入一個b的時候處於狀態2。變成“xxxxab”
- 當狀態2再輸入一個b,這是變成“abb”合法,又回到狀態1.
- 當狀態2再輸入一個a,這時變成了“aba”不合法狀態,成為狀態3
- 狀態3無論輸入什麽都是不合法的,都是狀態3。
這時候可以用一個數組表示這個狀態機:
a b
1 1 2
2 3 1
3 3 3
把ab也用1,2表示。
var runs = function(str) { var dfa = [ [], [1, 2], [3, 1], [3, 3], ]; var state = 1; for (var i = 0; i < str.length; i++) { if(str[i] == ‘a‘){ state = dfa[state][0]; } else if(str[i] == "b") { state = dfa[state][1]; } if(state === 3) { return state; } } return state }; console.log(runs("abbaaa"))
當最後一個輸入結束之後,看一下最後的狀態是處於狀態幾,通過自動機可以發現,只有在狀態1的時候是合法的。所以我只需要判斷state === 1.
DFA確定有限狀態自動機