“每台NFA 都存在一台识别同一语言的DFA;反方向成立是因为 DFA 的唯一后继可视为 NFA 的单元素后继集合。因此两种模型在有限字上的表达能力相同。”
形式陈述 ​
在有限状态自动机的共同骨架上,确定性有限自动机(DFA)是五元组
其中
“总”表示每个
于是
从关系模型看,DFA 是NFA的语法特例:每个后继集合都是单元素集。两者在有限字上的表达能力相同,但“特例”描述表示语法,“等价”描述可识别语言类;这两个层次不能混成一句“它们完全一样”。
直觉
DFA 的当前状态是已读前缀的充分摘要。若两个前缀把机器带到同一状态,那么以后接上任何相同后缀,它们都将经过相同的剩余运行并作出相同决定。设计状态时,应直接判断哪些前缀对所有未来都能安全地视为同一种情况;圆的数量只是这项判断的结果。
总转移让每个输入都有完整运行。实现中省略的边通常只是排版简写,数学上应指向一个拒绝死状态;否则交换接受态与拒绝态时,原先“没有下一步”的输入会无处可去,补集构造便失效。死状态把所有无法恢复的失败历史压缩成同一摘要,属于语言语义的一部分。
DFA 可以一遍扫描输入,运行时间为
例子与边界
HTTP 头部以字节模式 \r\n\r\n 结束。识别“输入中已经出现该分隔符”的 DFA 可用
例如读到 \r\n\r 时位于 \n,进入 \r,不能简单清零,因为这个新字节本身仍可能是下一次匹配的开头,应退到
正确性可按前缀长度归纳。初始空前缀的最长匹配长度为零;每读一个字节,转移表把旧候选后缀与新字节拼接,再保留最长的模式前缀。因而到达
图中的奇偶 DFA 展示另一类摘要:状态只记 1 的计数模
推论与应用
DFA 的唯一运行使补集、乘积构造、等价检查和最小化尤其直接。两个 DFA 可同步运行在状态对上;搜索一个“恰有一侧接受”的可达状态,就能找到区分两种语言的见证字,若不存在则语言相等。
虽然 DFA 在语法上限制更严,子集构造证明它与 NFA 在表达能力上等价;代价是一个
词法分析器、网络字节扫描器和有限事件监控常直接执行 DFA:每个输入只做一次表查找,运行路径可复现,也没有回溯爆炸。若确定化状态过多,则可以保留 NFA 或按需生成实际到达的子集;这是表示策略的折中,不是更换语言语义。
参考资料
- Michael Sipser, Introduction to the Theory of Computation, 3rd ed., Cengage, 2013, §§1.1–1.2.
- John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, 3rd ed., Pearson, 2006, Chapter 2.