【问题标题】:Minimum number of states in DFADFA 中的最小状态数
【发布时间】:2020-05-24 23:00:06
【问题描述】:

DFA 接受字符串(以 3 为底,即三进制形式)中的最小状态数等于 5 模 6?

我试过了,但做不到。

【问题讨论】:

    标签: automata dfa


    【解决方案1】:

    几乎所有模数问题的最小状态数是模数的基础。一般策略是每个模数都有一个状态,因为模数之间的转换与之前的数字无关。例如,如果您处于状态r4(代表x = 4 (mod 6)),并且遇到1 作为下一个输入,那么您的新模数是4x6+1 = 25 = 1 (mod 6),因此输入@987654326 上的r4 转换@ 是 r1。你会发现start状态和r0可以合并,一共6个状态。

    【讨论】:

    • MDFA 将包含 3 个状态
    【解决方案2】:

    让我们看一下语言中的几个字符串:

     12 =              1*3 + 2 =  5 ~ 5 (mod 6)
    102 =        1*9 + 0*3 + 2 = 11 ~ 5 (mod 6)
    122 =        1*9 + 2*3 + 2 = 17 ~ 5 (mod 6)
    212 =        2*9 + 1*3 + 2 = 23 ~ 5 (mod 6)
    

    1002 = 1*18 + 0*9 + 0*9 + 2 = 29 ~ 5 (mod 6)

    我们注意到所有字符串都以 2 结尾。这是有道理的,因为 6 是 3 的倍数,而从 3 的倍数中得到 5 的唯一方法是加 2。基于此,我们可以尝试解决字符串与 3 模 6 一致的问题:

      10 =  3
     100 =  9
     120 = 15
     210 = 21
    1000 = 27
    

    并没有出现真正的模式,但考虑一下:每个以 0 结尾的基数为 3 的数字肯定可以被 3 整除。偶数也可以被 6 整除;所以以 3 为底的表示以 0 结尾的奇数必须与 3 mod 6 一致。因为 3 的所有幂都是奇数,所以如果字符串中 1 的个数是奇数,我们知道我们有一个奇数。

    所以,我们的条件是:

    1. 字符串以 1 开头;
    2. 字符串有奇数个1;
    3. 字符串以 2 结尾;
    4. 字符串可以包含任意数量的 2 和 0。

    要获得这样一个 DFA 中的最小状态数,我们可以使用以空字符串开头的 Myhill-Nerode 定理:

    1. 空字符串后面可以跟该语言中的任何字符串。调用它的等价类 [e]
    2. 字符串 0 后面不能跟任何内容,因为有效的 base-3 表示没有前导 0。调用它的等价类 [0]。
    3. 字符串 1 后面必须跟以 2 结尾的偶数个 1。调用它的等价类 [1]。
    4. 字符串 2 后面可以跟该语言中的任何内容。实际上,您可以验证将 2 放在语言中任何字符串的前面会给出该语言中的另一个字符串。但是,它也可以跟以 0 开头的字符串。因此,它的类是新的:[2]。
    5. 字符串 00 后面不能跟任何东西来修复它;它的类与其前缀 0, [0] 相同。字符串 01 也一样。
    6. 字符串 10 后面可以跟任何以 2 结尾的偶数个 1 的字符串;因此它等价于类 [1]。
    7. 字符串 11 后面可以跟任何语言中的任何字符串;实际上,您可以验证在语言中的任何字符串前面添加 11 会提供另一种解决方案。但也可以跟以0开头的字符串,因此其类与[2]相同。
    8. 12 后面可以跟以 2 结尾的偶数个 1 的字符串,也可以跟空字符串(因为 12 实际上在语言中)。这是一个新的类,[12]。
    9. 21 等价于 1;类 [1]
    10. 22 等价于 2; [2] 类
    11. 20 相当于 2; [2] 类
    12. 120 与 1 无法区分;它的类是 [1]。
    13. 121 与 [2] 无法区分。
    14. 122 与 [12] 无法区分。

    我们在长度为 3 的新字符串上没有看到新的等价类;所以,我们知道我们已经看到了所有的等价类。它们是:

    • [e]:语言中的任何字符串都可以跟在这个后面
    • [0]: 后面没有字符串
    • [1]:以2结尾的偶数个1的字符串可以跟在这个后面
    • [2]:与 [e] 相同,但也是以 0 开头的字符串
    • [12]:与[1]相同,但也是空字符串

    这意味着我们语言的最小 DFA 有五个状态。这是 DFA:

          [0]
           ^
           |
           0
           |
    ----->[e]--2-->[2]<-\
           |        ^   |
           |        |   |
           1   __1__/   /
           |  /        /
           | |         1
           V V         |
           [1]--2-->[12]
             ^       |
             |       |
             \___0___/
    

    (图中未显示的转换是各自状态的自循环)。

    注意:我希望这个 DFA 有 6 个状态,正如 Welbog 在另一个答案中指出的那样,所以我可能错过了一个等价类。但是,在检查了几个示例并考虑了它在做什么之后,DFA 似乎是正确的:您只能通过将 2 视为最后一个符号(绝对必要)来进入接受状态 [12],并且您只能进入状态 [12]从状态 [1] 开始,您必须看到奇数个 1 才能到达 [1]……

    【讨论】:

    • MDFA 将包含 3 个状态
    【解决方案3】:

    乍一看,它似乎有 6 个状态,但可以进一步最小化。
    我们先来看状态转移表:

    这里,状态 q0, q1, q2,...., q5 分别对应于除以 6 时模数为 0,1,2,...,5 的状态。q0 是我们的初始状态,由于我们需要模数 5,因此我们的最终状态将是 q 5

    从上面的状态转换表中得出的一些观察结果:

    • 状态 q0、q2 和 q4 完全相同
    • 状态 q1、q3 和 q5 完全相同

    在相同输入上转换到相同状态的状态可以合并为单个状态。

    注意:最终状态和非最终状态永远不能合并。

    因此,我们可以将 q0, q2, q4 合并在一起, q1, q 3 一起使状态 q5 远离排序规则。
    最终的 Minimal DFA 有 3 个状态,如下所示

    【讨论】:

    • 这允许在数字的有效位值表示中通常不允许使用前导零。
    • 该问题没有具体提及有关表示的任何内容。
    猜你喜欢
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2012-06-23
    • 2020-02-14
    • 2013-12-24
    • 2014-02-22
    相关资源
    最近更新 更多