DFA:每步只有一条路
一台 deterministic finite automaton 就五样东西:一组 state、一个字母表 alphabet、一个 start state、一组 accept state,以及一张 transition function δ——它规定「在某 state 读到某字符,去哪个 state」。deterministic 的约束很严格:对每个(state,字符)组合,δ 给出恰好一个去向。于是读一个串的过程完全确定——从 start 起步,逐字符照 δ 跳,读完看落点是不是 accept state。
下面这台机器读二进制串,判断它代表的数能否被 3 整除。思路:state 就记「目前余数是 0 / 1 / 2」。多读一个 bit,数值变成
,余数也随之更新——这正好就是三条 state 之间的跳转规则。读完若停在 r0(余数 0)就 ACCEPT。试试 1100(=12,能整除)与 101(=5,不能)。
DFA 的运行效率来自确定性。没有任何「猜测」成分:读 n 个字符就恰好跳 n 次,每跳一次 O(1) 查一次 δ 表。整段输入 O(n)、且只过一遍、指针绝不回头。代价在构造期——要先把这张 δ 表(以及所有 state)准备好。NFA 一页反过来:表小巧,但读的时候要同时考虑多种可能。
留意「卡死」。本演示里 δ 是完整的(每个 state 对每个字符都有去向),所以不会卡。但若某(state,字符)没定义转移,严格的 DFA 会直接 reject。教科书里常补一个「死态 (dead state)」把这些缺口都接过去——在 DFA minimization 一页还会见到它。