【发布时间】:2020-05-24 23:00:06
【问题描述】:
DFA 接受字符串(以 3 为底,即三进制形式)中的最小状态数等于 5 模 6?
我试过了,但做不到。
【问题讨论】:
DFA 接受字符串(以 3 为底,即三进制形式)中的最小状态数等于 5 模 6?
我试过了,但做不到。
【问题讨论】:
几乎所有模数问题的最小状态数是模数的基础。一般策略是每个模数都有一个状态,因为模数之间的转换与之前的数字无关。例如,如果您处于状态r4(代表x = 4 (mod 6)),并且遇到1 作为下一个输入,那么您的新模数是4x6+1 = 25 = 1 (mod 6),因此输入@987654326 上的r4 转换@ 是 r1。你会发现start状态和r0可以合并,一共6个状态。
【讨论】:
让我们看一下语言中的几个字符串:
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 的个数是奇数,我们知道我们有一个奇数。
所以,我们的条件是:
要获得这样一个 DFA 中的最小状态数,我们可以使用以空字符串开头的 Myhill-Nerode 定理:
我们在长度为 3 的新字符串上没有看到新的等价类;所以,我们知道我们已经看到了所有的等价类。它们是:
这意味着我们语言的最小 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]……
【讨论】:
乍一看,它似乎有 6 个状态,但可以进一步最小化。
我们先来看状态转移表:
这里,状态 q0, q1, q2,...., q5 分别对应于除以 6 时模数为 0,1,2,...,5 的状态。q0 是我们的初始状态,由于我们需要模数 5,因此我们的最终状态将是 q 5
从上面的状态转换表中得出的一些观察结果:
在相同输入上转换到相同状态的状态可以合并为单个状态。
注意:最终状态和非最终状态永远不能合并。
因此,我们可以将 q0, q2, q4 合并在一起, q1, q 3 一起使状态 q5 远离排序规则。
最终的 Minimal DFA 有 3 个状态,如下所示:
【讨论】: