DFA: - 所有字符串,使得每个五个连续符号的块包含至少两个0

时间:2015-01-23 19:40:52

标签: automata dfa computation-theory nfa

我想构建语言的DFA:所有字符串的集合,使得每个五个连续符号的块包含至少两个0。如何记录最近5个条目。总之如何解决这类问题。我在互联网上获得了DFA图,但无法理解。任何人都可以解释一下。

7 个答案:

答案 0 :(得分:0)

我能够找到它的解决方案,但是,它可能不是最有效的。我的解决方案是一个完整的二叉树,其工作方式类似于概率树,即if 0 - 0 - 0 - 0 - 0真状态 0 - 0 - 0 - 0 - 1真实状态 0 - 0 - 0 - 1 - 1真实状态 0 - 0 - 1 - 1 - 1真实状态 0 - 1 - 0 - 0 - 0真状态 1 - 0 - 0 - 0 - 1真实状态......然而,它背后的想法是,无论何时完成所有真实状态,你都会向它们添加4种不同的状态。因此,在最后一个状态如果是真的,它将返回到第一个原始状态。

答案 1 :(得分:0)

我有答案,但我不确定它是否最有效率。在我解决问题的过程中,我将尝试解释我的理解。

我们必须构建一个 DFA ,这样每5个长度的子字符串至少包含2个0。因此,语言将包含具有给定限制的所有字符串< = 5,没有限制+字符串长度(> = 5)。

问题的难点在于我们必须追踪两件事:

a)字符串的长度

b)检查5长度子串是否至少有2个。

我会尝试绘制所有可能的状态: DFA

我们正在跟踪子串中出现的0和1。

一旦我们在一个5长子字符串[出现在树的第5级]得到2 0,我们将回到初始状态并再次开始。 我们扩展树,直到每5个长度的子串到达所需的状态为2 0。然后,我们再次分支到树的开头。我们已经确保我们不会以这种方式违反规则的任何5长度子字符串。

答案 2 :(得分:0)

如果您希望接受这样的字符串,则可以使用一种很好的方法。

->您不想拥有 11111, 11110, 11101, 11011, 10111, 01111,

作为子字符串 因为只有这些少于2 0个

您绘制的DFA中没有上述字符串作为子字符串,并且您获得了良好且简单的DFA

答案 3 :(得分:0)

这是一个长度为4的字符串的示例。这应该给您一些直觉,例如,如何对5个字符的块进行操作。红色圆圈表示陷阱状态,在该状态下将不再接受字符串。

Deterministic Finite Automata Example

答案 4 :(得分:0)

与其考虑什么会起作用,不考虑什么会起作用,然后再按照类似的模式进行工作……

第1步],您将获得1111、10111、11011、11101的情况,字符串将进入转储状态(q4)。

Step 1

步骤2]将通过查找模式来填补每个状态中的空白。

示例:
->在状态q5(10)上->如果为0 [1.e 100],则表示您正在重新启动类似于(00000)的序列检查。
->对于状态q6(101)->如果为0 [即1010]->您可以看到它在重复,因此在状态q6(101)时它将返回到q5(10), ->状态为q7(1011)->如果为0 [即10110]->这将导致重复q8(110),
->在状态q8(110)上->如果0 [即1100]->等于重复该序列,则重新开始,
->在状态q9(1101)->如果为0 [即11010]->您看到10被重复,所以q5(10),
->状态为q10(1110)->如果为0 [即11100]->即再次重新启动。

Step 2

答案 5 :(得分:0)

根据Myhill-Nerode定理,该语言的最小DFA具有12种状态。

状态号需要捕获:

  1. 当前在当前块中看到的字符数:0-4
  2. 到目前为止,您是否在区块中看到0、1或> = 2个零。

对于这两件事,每种不同值的每种组合都意味着到目前为止所看到的一组可接受的后缀不同,因此这些组合中的每一个都需要一个不同的状态。

状态(0,1),(0,2)和(1,2)不会发生,因为在当前块中看到的零比字符还多。

状态(4,0)-当前块中有4个字符,但到目前为止没有零,是错误状态,因为无法从那里获得接受。

我建议您在5x3数组中写入15种可能的状态,例如(00)(01)(02)(10)(11)...(42)。将(00)标记为开始状态,标记所有接受状态,然后从每个状态中提取2个转换-一个表示0,一个表示非0。

答案 6 :(得分:0)

我们至少需要 48 个不同的状态来定义接受这种语言的自动机。 假设我们已经扫描了一部分字符串,使得到目前为止扫描的字符串长度大于或等于 5,我们关注 32 个剩余状态,范围从 00000、00001 一直到 11111。转换函数如何工作的示例是 d(00111, 1) = 01111,即通过简单地将当前状态值向左移动 1 并附加手头的字母表。所有最终状态的集合将是具有 2 个或更多 0 的状态,例如 00000、10011、10110、10000 等。 现在,因为我们被告知也接受小于 5 的字符串。我们不能将状态 00000 初始化为初始状态。例如,如果机器输入 1111,则 delta(00000, 1111) = 01111,其中 delta = 扩展转换函数。请注意,尽管 1111 属于定义的语言,但 01111 不是接受状态。因此,如果有的话,我们需要跟踪 4 个初始字符,而这样做的方法是构建一个二叉树,其中前 4 个字符的级别具有 1(初始状态)、2、4、8 和 16 个状态。总共有 63 个不同的州。请注意,树中的每个状态都是接受状态。 然而,我们能做得更好吗?事实证明,是的,我们可以。我们可以定义 16 个不同的状态来捕获前 4 个字符的信息,而不是构建具有 31 个不同状态的树,从 0000 到 1111,所有这些都是接受状态。这一次,状态总数变成了 48。请注意,状态 0000 是初始状态。