[英]How to determine whether finite-state automata is deterministic?
我有一個自動化課程,真的困擾我的困難。 我今天花了將近5個小時,卻沒有真正知道它是否正確。 任務是編寫一個Java代碼,用於確定給定的自動機是否具有確定性。 我所擁有的是一個代表自動機的類,它有以下五個變量:int alphabet_size; int n_states; int delta [] []; int initial_state; int accepting_states [];
Delta代表跟隨例如真實自動機q1,1,q2在程序中將看起來像{1,1,2}。 我知道在非確定性自動機中可能存在多個可能的狀態,但我不知道如何計算它。
提前致謝。
為了解決這個問題,我會這樣做:
如果你可以迭代整個數組,那就是確定性的!
使用您現在擁有的成員變量,您只能表示確定性FSA。 為什么? 因為一個NDFSA是其中有一個狀態q 1和輸入 ,使得兩個
三角洲。 你實現了這個(q from ,input) - > q to mapping as int[][]
,這意味着對於每個instate-input對,你只能存儲一個outstate。
一個非常快速的解決方法是允許所有instate-input對的outstates列表,如下所示:
ArrayList[][] delta;
但是,這很難看。 如果你意識到delta實際上是從 - > input - > q 到 q的映射q ,我們可以得到一個更好的解決方案*,它可以用兩種方式括起來:
要實現的另一件事是int[]
在概念上與Map<Integer, Integer>
。 有了它,第二個映射可以在Java中實現為:
Map<Integer, Map<Integer, List<Integer>>> delta;
無論您選擇哪種實現,決定FSA是否具有確定性的測試都非常簡單,並且來自定義: 如果delta
中所有列表的長度<= 1,則A是DFSA; 否則,它是NDFSA 。
*請注意,真正的FSA庫通常使用不同的方法。 例如, foma使用具有字段instate,outstate和輸入字符的轉換對象數組。 但是,對於初學者來說,上面的那些可能更容易處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.