Java中的NFA仿真

Java中的NFA仿真,java,regex,computer-science,nfa,Java,Regex,Computer Science,Nfa,我被指派在Java中模拟NFA。现在,我必须模拟NFA的以下正则表达式是 ab*((b|d)|c*) 我想我的电子符号太多了。我只是想知道下面的图片是否正确 您的NFA图表是正确的。它将匹配regexab*((b | d)| c*),而不匹配其他内容。但是,它可以简单得多,例如: 节点10、11、12和13可能会被压缩成两个节点?这是我最初的想法,但讲师希望使用上面的重复方式,并使用汤普森结构创建NFA。我只是对2-3E转换、3-4E转换和4-5或4-7E转换相当怀疑。好吧,2-3可以减少,如

我被指派在Java中模拟NFA。现在,我必须模拟NFA的以下正则表达式是

ab*((b|d)|c*)
我想我的电子符号太多了。我只是想知道下面的图片是否正确


您的NFA图表是正确的。它将匹配regex
ab*((b | d)| c*)
,而不匹配其他内容。但是,它可以简单得多,例如:


节点10、11、12和13可能会被压缩成两个节点?这是我最初的想法,但讲师希望使用上面的重复方式,并使用汤普森结构创建NFA。我只是对2-3E转换、3-4E转换和4-5或4-7E转换相当怀疑。好吧,2-3可以减少,如果
b*
导致没有
b
的话,你将有一个
e
从1-2的转换。除此之外,我认为它的其余部分似乎是合适的。最终的结果是一样的,只是少了一个节点。@释放了您链接的示例是
a*
,它是
1-e-2-a-3-e-4
(带跳跃)。我只是指出,如果这是你的教授(或任何人)想要的正确方式,那么你应该将相同的模式应用到表示
b*
的图形部分。给出的NFA是正则表达式的一个简单翻译。有简单的算法来确定和最小化有限自动机;在任何基本的TCS教科书中都可以找到它们。因此,这个问题对于即将到来的未来可能是完美的。所以,如果你想有这样一个问题的地方,请继续,并帮助这个建议起飞!我不认为这是完全正确的,分支部分
((b | d)| c*)
是两个分支,而不是三个,它是(b | d)或c*,因此,从
b
节点,将其表示为完全独立的路径,然后分支到
b
d
,不是更准确吗?我确信上面的一个没有使用Thompson构造。它比较短,但我的讲师给了我一种如何做的风格。@unrelated我想说汤普森是一种创建NFA的算法(过程),而不是NFA的一种类型。你可以看到我的NFA是由汤普森创建的,然后经过优化。(顺便说一句:问题是你的NFA是否等同于你的正则表达式。关于Thomspon没有任何内容:-)@izuriel
(b | d)| c*
等同于正则表达式代数中的
b | d |(c*)
,不是吗?克莱恩闭包比交替更重要。@StaffanNöteberg是的,我明白你的意思。刚开始的时候,这让我很不舒服,但结果是一样的:P