簡體   English   中英

如何確定有限狀態自動機是否具有確定性?

[英]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}。 我知道在非確定性自動機中可能存在多個可能的狀態,但我不知道如何計算它。

提前致謝。

為了解決這個問題,我會這樣做:

  1. 創建一個Map(字符串,字符串或整數),我將使用該鍵來檢查實際狀態>符號是什么以及跟蹤事務進入哪個狀態的值(如果實際狀態沒有事務,則為null或-1)那個符號);
  2. 填充映射鍵和值,例如:map.put(“1> 1”,null)表示從狀態1開始,符號1變為null。 現在,為每種可能性設置null或-1;
  3. 迭代您的交易可能性,構建密鑰字符串,從地圖中檢索相應的值。 如果它為null,則包含進入的狀態的數量,否則表示存在來自相同狀態的另一個事務,該狀態具有相同的符號,進入不同的狀態,因此它不是確定性的;

如果你可以迭代整個數組,那就是確定性的!

使用您現在擁有的成員變量,您只能表示確定性FSA。 為什么? 因為一個NDFSA是其中有一個狀態q 1輸入 ,使得兩個

  • (q 1 ,a) - > q 2
  • (q 1 ,a) - > q 3

三角洲。 你實現了這個(q from ,input) - > q to mapping as int[][] ,這意味着對於每個instate-input對,你只能存儲一個outstate。

一個非常快速的解決方法是允許所有instate-input對的outstates列表,如下所示:

ArrayList[][] delta;

但是,這很難看。 如果你意識到delta實際上是 - > input - > q q的映射q 我們可以得到一個更好的解決方案*,它可以用兩種方式括起來:

  • (q from - > input) - > q to :這就是你所擁有的,帶有一點不同的符號
  • q from - >(輸入 - > 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM