[英]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.