繁体   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