DFA:每步只有一条路
一台 deterministic finite automaton 由五样东西给定:一组状态、一个字母表、一个 start state、一组 accept state,以及转移函数 ,它规定「在某状态读到某字符,去哪个状态」。确定性的约束在于:对每个(状态,字符)组合, 给出恰好一个去向。读一个串的过程因而完全确定,从 start state 起步逐字符照 跳,读完看落点是不是 accept state。
1 · 一台判整除的三态机器
这台机器读二进制串,判断它代表的数能否被 3 整除。状态只记当前余数是 0、1 还是 2:多读一个 bit 时数值由 变成 ,余数随之更新,这三条更新规则就是状态之间的转移。读完停在余数 0 的状态即接受。
1100(十进制 12,能被 3 整除)与 101(十进制 5,不能)对照,逐字符观察读取指针推进与当前状态在图上的高亮。确定性直接给出运行代价:读 个字符恰好跳 次,每跳一次是 的查表,整段输入 ,只过一遍且指针不回头。代价转移到了构造期,这张转移表与全部状态都得预先备好。NFA 页的取舍正相反:表小巧,但读的时候要同时考虑多种可能。
警示 · 本页的 是完整的,每个状态对每个字符都有去向,所以不会卡住。若某个(状态,字符)没有定义转移,严格意义上的 DFA 会直接拒绝。教科书通常补一个死状态(dead state)把这些缺口接过去,使 变成全函数;DFA minimization 页还会再遇到它。