1. 程式人生 > >DFA確定有限狀態自動機

DFA確定有限狀態自動機

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. 沒有輸入的時候處於狀態1,當輸入一個a的時候還是處於狀態1。
  2. 當輸入一個b的時候處於狀態2。變成“xxxxab”
  3. 當狀態2再輸入一個b,這是變成“abb”合法,又回到狀態1.
  4. 當狀態2再輸入一個a,這時變成了“aba”不合法狀態,成為狀態3
  5. 狀態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確定有限狀態自動機