📜  从正则表达式设计有限自动机(第 1 组)

📅  最后修改于: 2021-09-28 10:55:49             🧑  作者: Mango

在本文中,我们将看到一些流行的正则表达式以及如何将它们转换为有限自动机。

  • 偶数 a :偶数 a 的正则表达式是(b|ab*ab*)* 。我们可以构造一个有限自动机,如图 1 所示。

    自动机

    上面的自动机将接受所有具有偶数个 a 的字符串。对于零 a,它将处于最终状态 q0。对于一个 ‘a’,它将从 q0 到 q1 并且字符串将不被接受。对于任何位置的两个 a,第一个“a”将从 q0 到 q1,第二个“a”从 q1 到 q0。因此,它将接受所有具有偶数个 a 的字符串。

  • 字符串’AB’作为子字符串:用于与’AB’的字符串的正则表达式作为子字符串是(A | B)* AB(A | B)*。我们可以构造有限自动机,如图 2 所示。

    图2

    上述自动将接受具有“AB”作为子字符串的所有。对于 b’s,自动机将保持在初始状态 q0。读取 ‘a’ 后,它将移动到 q1,之后所有 ‘a’ 都保持相同状态。如果读到’b’,它将移动到q2。这意味着,如果字符串到达 q2,则该字符串已将 ‘ab’ 读取为子字符串。

  • 计数为 ‘a’ 的字符串可被 3 整除:计数为 3 的字符串的正则表达式为 {a 3n | n >= 0}。我们可以构建如图 3 所示的自动机。

    图3

    上面的自动机将接受所有形式为 a 3n 的字符串。对于 ɛ,自动机将保持在初始状态 q0 并且它会被接受。对于字符串’aaa’,它将从q0 移动到q1,然后是q1 到q2,然后是q2 到q0。对于每组三个 a,它将达到 q0,因此被接受。否则,它将在 q1 或 q2 中,因此被拒绝。

    注意:如果我们想设计一个 a 的数量为 3n+1 的有限自动机,可以使用与 q1 相同的自动机而不是 q0 的最终状态。
    如果我们想用语言 {a kn | 设计一个有限自动机n >= 0},需要 k 个状态。我们在示例中使用了 k = 3。

  • 可被 3 整除的二进制数:可被 3 整除的二进制数的正则表达式为(0|1(01*0)*1)* 。被3整除的二进制数的例子有0、011、110、1001、1100、1111、10010等。 被3整除的二进制数对应的DFA如图4所示。

    图 4

    上述自动机将接受所有可被 3 整除的二进制数。对于 1001,自动机将从 q0 到 q1,然后从 q1 到 q2,然后从 q2 到 q1,最后从 q2 到 q0,因此被接受。对于 0111,自动机将从 q0 到 q0,然后是 q0 到 q1,然后是 q1 到 q0,最后是 q0 到 q1,因此被拒绝。

  • 带有正则表达式的字符串 (111 + 11111)* :使用此正则表达式接受的字符串将有 3、5、6(111 次)、8(11111 次和 111 次)、9(111 次)、10(11111 次)以及之后所有其他计数为 1。给定正则表达式对应的 DFA 如图 5 所示。

    图5

问题:具有奇数个 a 的字符串的最小状态数是多少?
解: a 奇数的正则表达式为 b*ab*(ab*ab*)*,对应的自动机如图 6 所示,最小状态数为 2。
图 6

目录 |设计确定性有限自动机(第 1 组)