【问题标题】:Finding the complement of a DFA structure寻找 DFA 结构的补集
【发布时间】:2015-03-06 19:07:46
【问题描述】:

所以我正在研究一种将 dfa 转换为补码的方法。补码拒绝 dfa 接受的所有字符串,并接受 dfa 拒绝的所有字符串。为此,我应该遵循以下算法: “首先添加一个显式的死状态并显式地对其进行所有转换。其次将所有最终状态更改为非最终状态,并将所有非最终状态更改为最终状态。”

我对此进行了尝试,但没有成功。我不认为我理解正确。

首先,我将所有最终状态更改为非最终状态,将非最终状态更改为最终状态。

然后对于每个状态,如果它没有带有字母的转换,我会使用这些字母添加从该状态到显式死状态的转换

这对吗?

【问题讨论】:

  • 您似乎在算法中颠倒了“第一”和“第二”这两个词的含义。我建议你再试一次,使用这些词的更传统的定义。
  • @rici 如果我先添加死状态,然后我必须遍历所有状态并将最终状态更改为非最终状态,反之亦然。既然死亡状态不会是最终的,它会被改为最终的吗?还是死了?
  • 没错。创建时的“死亡”状态是非最终状态,second 步骤会将其更改为最终状态。它仍然会将自己作为每次转换的目标,因此一旦进入,它就不能离开。更像是一个黑洞而不是僵尸:)

标签: algorithm dfa nfa complement


【解决方案1】:

不,您应该首先将所有状态和符号转换到新创建的死状态,这样特定符号就不会从特定状态转换,之后您应该将所有状态设为最终状态状态为非最终状态,反之亦然。当我们按这个顺序执行时,死状态变为最终状态,这正是应该发生的(如果我们达到死状态,给定的字符串不会被原始自动机接受。因此,它应该被它的补码接受)。

【讨论】:

  • 所以我的算法似乎可以工作,但是每次都会增加一个额外的死状态。不管是否已经存在 dead_state。所以最后总是有额外的。我应该如何以最有效的方式解决这个问题?
  • @JakeSenior 如果你有一个不变量,那么字母表的所有符号都会从所有状态转换,根本不需要创建死状态。
猜你喜欢
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2011-04-24
  • 2011-01-13
相关资源
最近更新 更多