我有一个自动化课程,真的困扰我的困难。我今天花了将近5个小时,却没有真正知道它是否正确。任务是编写一个Java代码,用于确定给定的自动机是否具有确定性。我所拥有的是一个代表自动机的类,它有以下五个变量: int alphabet_size; int n_states; int delta [] []; int initial_state; int accepting_states [];
Delta代表以下例如在实际自动机中,程序中的q1,1,q2看起来像{1,1,2}。我知道在非确定性自动机中可能存在多个可能的状态,但我不知道如何计算它。
提前致谢。
答案 0 :(得分:0)
为了解决这个问题,我会这样做:
如果你可以迭代整个数组,那就是确定性的!
答案 1 :(得分:0)
使用您现在拥有的成员变量,您只能代表确定性FSA。为什么?因为NDFSA是一个存在状态 q 1 并且输入 a 以使其同时存在的
是三角洲。你实现了这个(q from ,input) - > q to 映射为int[][]
,这意味着对于每个instate-input对,您只能存储一个州。
一个非常快速的解决方法是允许所有instate-input对的列表列表,如下所示:
ArrayList[][] delta;
然而,这很难看。如果您意识到delta实际上是来自 - >的映射 q ,我们可以得到更好的解决方案*输入 - > q to ,它可以用两种方式括起来:
要认识到的另一件事是int[]
在概念上与Map<Integer, Integer>
相同。有了它,第二个映射可以用Java实现:
Map<Integer, Map<Integer, List<Integer>>> delta;
无论您选择哪种实现,决定FSA是否具有确定性的测试都非常简单,并且来自定义: A是DFSA iff delta
中所有列表的长度是&lt; ; = 1;否则,它是NDFSA 。
*请注意,真正的FSA库通常使用不同的方法。例如,foma使用具有字段instate,outstate和输入字符的转换对象数组。但是,对于初学者来说,上面的那些可能更容易处理。