加深對DFA工做原理的理解。
java
什麼是FA,也叫有窮狀態自動機;書上是這麼說的👇,是一個五元組(狀態集合,字母表,狀態轉移表,開始狀態,終止狀態集合)
什麼是DFA,也是一個五元組,在FA的基礎上加了一個約束條件:每個狀態結點只能發出一條具備相同符號的邊;也就是同一狀態不能發出(輸入字符相同的)兩條邊上。能夠發出輸入字符不一樣的多條邊
下圖就是一個DFA栗子👇編程
下圖就是NFA的栗子👇(容許從一個狀態發出多條具備相同符號的邊,甚至容許發出標有ε(表示空)符號的邊)
數據結構
完成這個實驗,只須要知道DFA就能夠了。
函數
什麼是有向圖:由頂點和有方向的邊構成的圖
如何在程序中存儲有向圖?
可使用數據結構中學的「鄰接矩陣」
「鄰接矩陣」就是一個「二維表」
設計
採用面向對象的方式編程,沒有對象就new一個。3d
狀態結點類的總體構造是這樣的👇
對象
DFA的總體構造是這樣的👇blog
5元組對應5個屬性,其它還應該有狀態表結點個數、字母表字符個數、最大存儲的結點個數等屬性。👇
遞歸
經過書上的一個DFA例子,理解一下狀態集合、終結點集合、字母表集合是這樣存儲的👇
字符串
選用例3-1 有窮自動機M: ({q0,q1,q2},{0},轉換函數,q0,{q2}),做爲樣例
這個自動機功能是:識別偶數個0,好比00是合法的句子;而000就是非法的句子。
狀態轉換表以下
下圖是例題3-1的DFA圖👇
init()函數初始化例3-1的自動機👇,把例3-1的五元組分別存儲到實例對象的5個屬性中
graphInit()函數初始化狀態轉換表
狀態集合、終結點集合、字母表集合是這樣存儲的👇
而後試着理解狀態轉換表的存儲👇
run()啓動函數👇
dfs()核心遞歸程序👇
例3-1的DFA,功能:只識別偶數個0的句子。
主函數:
運行效果:
下次再寫吧。 有疑問能夠在評論區提出