【问题标题】:Am I correct? (Finite Automata)我对么? (有限自动机)
【发布时间】:2011-03-05 17:59:13
【问题描述】:

我得到了一个正则表达式,我想将其转换为 NFA,然后是 DFA。这是正则表达式:

a ( b | c )* a | a a c * b

然后我使用汤姆森算法将其转换为 NFA:

这是 DFA:

有人可以快速查看一下,让我知道我是对还是错?

【问题讨论】:

  • DFA 错误,它接受 abacb 以及其他无效字符串。您的 NFA 中还有很多多余的 epsilon 转换,但这并不重要。作为一般规则,等效的 DFA 几乎总是比 NFA 具有更多的状态。
  • 我还假设这是家庭作业?
  • 是的,它的功课。我不是在寻求解决方案,我只是想知道我是否在正确的轨道上,并感谢您的回答。

标签: finite-automata turing-machines dfa nfa


【解决方案1】:

因为这很可能是家庭作业,所以我很犹豫是否给你完整的正确解决方案。

您的 NFA 看起来是正确的,但有许多不必要的多余状态,但不会对其正确性产生不利影响。 (乍一看,您似乎可以删除 11 个状态。)

不过,您的 DFA 不正确。这是因为当您开始处理字符串的一个或另一个条件时,您稍后会将它们重新连接在一起。这允许它从匹配a(b|c)*a 的已接受字符串中获取路径,并通过前往节点15,1711 获取另一个bc。然后它会接受这个字符串,即使它与您的表达式不匹配。

您需要做的基本上是阻止这种情况发生。如果您还有其他问题,请随时提出。

我强烈建议列出你知道应该接受和不应该接受的测试字符串,然后跟踪它们,确保你的自动机以正确的(接受或拒绝)状态结束。

【讨论】:

  • 我刚刚编辑了它,你能告诉我这是否正确吗? img263.imageshack.us/img263/7606/dfah.png 谢谢!
  • +1,但多余的 epsilon 转换并非不切实际:许多自动机工具包都会产生大量此类转换。
  • aa 现在不被接受,但我认为就是这样(15,17 循环中的c 也消失了)。是的,我知道它们并非不切实际,我一直都是手工制作自动机,所以这样的东西对我来说很笨拙。
  • (因为这似乎已经回答了你的问题,你应该点击它左边的检查接受它,谢谢:)
  • 谢谢安德鲁!我也不喜欢在 NFA 中有这么多的 epsilon,但是我的教授说我必须遵循 Thomson 的算法,它要求你有很多 epsilon。这就是我过度使用它们的原因。再次感谢。
猜你喜欢
  • 2017-01-04
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2013-11-29
  • 2017-10-11
  • 1970-01-01
  • 2015-06-29
相关资源
最近更新 更多