繁体   English   中英

DFA 中的最小状态数

[英]Minimum number of states in DFA

DFA 中接受字符串(基数为 3,即三元形式)中与 5 模 6 一致的最小数状态?

我试过了,但做不到。

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

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

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

  • 状态 q 0 , q 2和 q 4完全相同
  • 状态 q 1 , q 3和 q 5完全相同

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

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

因此,我们可以将 q 0 , q 2 , q 4合并在一起,将 q 1 , q 3合并在一起,使状态 q 5远离整理。
最终的最小 DFA 有 3 个状态,如下所示 最小 DFA

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

 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] ...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM