我正在尝试开发一种在Java中执行非确定性有限自动机的模拟。第一个命令行参数是定义机器的文本文件。第二个参数是输入字符串。如果它接受字符串,则打印到标准输出"接受"然后是一个可以结束的接受状态列表。如果它拒绝,则输出"拒绝"然后列出所有可能的最终状态。
例如,文字:
state 1 start
state 2
state 7 accept
transition 1 0 1
transition 1 1 1
transition 1 0 2
transition 2 0 2
transition 2 0 1
transition 2 1 1
transition 2 0 7
transition 7 0 7
transition 7 1 7
看起来像:
输入字符串10将输出
reject 1 2
并输入字符串000将输出
accept 7
我需要建议使用哪些数据结构。我想过使用哈希映射和集合,但我不确定。
答案 0 :(得分:5)
我认为你应该transform将你的自动机变成一个确定性的自动机,然后做一些显而易见的事。
在软件中实现有限状态机有三种常用方法:
switch
语句为当前状态和输入字符显式定义代码中的下一个状态。由于您需要在运行时构建自动机,因此最后两个选项并不适用,因此您应该使用查找表。如果您的字母表很小,您可以记下所有过渡。如果字母表很大,这可能会浪费很多空间,你可以考虑表压缩,它曾经是一个活跃的研究领域。
对于Downvoters:您无法编写一个“执行”非确定性自动机的确定性程序。然而,通过理论计算机科学的一个相当基本的定理,您可以通过完全自动化的过程将任何非确定性有限状态自动机转换为确定性自动机,即可以轻松实现的确定性算法在软件中。每个计算机科学专业的学生都应该使用铅笔和纸张至少完成一次这个程序。如果你这样做,你将很快看到如何跟踪原始自动机的哪些状态进入确定性状态的哪些状态。然后,简单地模拟后一个,看看它结束的状态,并输出构成它的原始非确定性自动机的状态。
答案 1 :(得分:2)
NFA表示您可以一次拥有一组状态。因此,要表示NFA的当前状态,请使用Set interface。
设置界面保证不会有任何重复的状态。这很重要,因为NFA一次有多个州。如果你使用任何其他数据集,那么这个gurrentee就不存在了。 在NFA的情况下,在每个转换中具有重复状态的机会是指数的。但是状态总是有限的。设置界面可确保您的当前设置将填充重复项。
对于空间和性能,您可以使用Enumset作为Enumset使用位向量来在内部存储状态。
算法:
初始化以开始状态
从索引0开始从右到左处理字符串;
用于更新时使用状态转换的字符;
如果任何此转换导致最终状态,这意味着接受字符串。