确定有限自动机
从五元组定义到最小化与等价性,彻底搞懂 DFA 识别正则语言的边界
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
确定有限自动机
从五元组定义到最小化与等价性,彻底搞懂 DFA 识别正则语言的边界
什么是有限自动机
上页我们见过确定有限自动机——下一步永远唯一的那种机器。但「自动机」三个字到底是什么意思?先把确定的限制摘掉,从更朴素的角度看:什么是有限自动机?
楼层=状态,按钮=输入,控制板决定怎么动
为什么需要「确定」二字
同样投 5 角按 A,结果时而是可乐时而是橙汁——这种机器你敢用吗?这正是 NFA 的窘境。DFA 用「确定」二字,把下一状态钉死为唯一,彻底消除这种不可预测。
函数对每个 x 给唯一 y;NFA 像「关系」,同一 x 可映到多个 y
DFA的五元组定义
前几页我们用直觉理解了DFA——状态有限、读符号、一步步跳。要严谨地描述它『长什么样、怎么工作』,需要五个分量说清楚:M=(Q,Σ,δ,q₀,F)。
按钮面板=Σ,机内状态=Q,按键逻辑=δ,待机态=q₀,出货完成=F
DFA定义各分量详解
中间三圆点是Q,左侧两符号是Σ,三条虚线引出q₀、F、δ标注。
状态转移图的画法
把五元组四个分量逐一对应到图上的圆节点、源箭头、带标签弧、双圈上。
扩展转移函数的递归定义
把只能吃一个字符的 δ 扩展成能处理整个字符串的 δ̂,靠两条递归子句。
扩展转移函数的工作原理
输入固定为 010;从左到右看递归的逐层展开。节点是“当前结果 / 已读前缀”,边表示本次调用基础转移函数 δ。
DFA如何接受字符串
扩展转移函数告诉我们:给定任意字符串,从q0出发总能走到唯一确定的终点。但走到哪里才算是「成功」?这就要靠接受集F来下结论了。
q0是起点站,字符串每个字符是车票上的站名,F是终点站集合,能到终点算走对路线
接受与拒绝的判定过程
看 DFA 如何决定取舍:串 '01' 与 '10' 走同一机器,差在最终落入何态。
DFA的语言定义
上一页我们对单条字符串判定「接受/拒绝」。把所有被接受的字符串拢成一个集合,就是这台 DFA「认识」的语言。
证件上的字符被门卫逐位过目(对应 δ̂ 一步接一步),最终请进门 ≡ 落在终态 F
正则语言的概念
上页我们把DFA的语言 L(M) 定义为机器接受的所有字符串的集合。现在把所有能被某个DFA接受的语言归为一类,给个名字——正则语言。这是从机器视角到语言视角的一次切换。
给一类具有共同性质的集合命名:偶数=能被2整除的整数;正则语言=能被DFA接受的语言
正则语言与正则表达式
正则语言是「对象」,正则表达式是描述它的「笔」——初学者常混为一谈,搞清关系才能理解等价性定理。
- 本质:串的集合(数学对象)
- 定义:被某 DFA 接受的所有串
- 唯一性:客观存在,与描述方式无关
- 关注问题:L 是否属于正则类
- 本质:递归书写的记号(语法工具)
- 定义:从字母表按 | · * 递归构造
- 多重性:多个式子可描述同一语言
- 关注问题:怎样写出 L 的具体式子
正则语言的封闭性
上一页我们确认正则语言与正则表达式等价。现在换个角度:两个正则语言摆在面前,能不能并起来、交起来、取反、拼接?拼出来的还是正则语言吗?
「封闭」=运算结果没跑出原集合;整数对加法封闭、对除法不封闭
从状态转移图构造DFA
图是DFA的可视化语言,五元组是它的形式化语言。这页教你把图'翻译'回五元组,五步走完不重不漏。
从语言描述构造DFA
把自然语言描述的语言翻译成DFA,本质上是把约束条件编码进状态与转移里。
DFA的实现:状态转移表
把 δ 物化为一颗字典,逐字符查表即完成模拟。
转移表把 δ: Q×Σ→Q 存成有限字典;逐字符 O(1) 查表推进状态,字母表守卫保证了「每读一个符号都能找到下一个状态」——这是 DFA 定义中 δ 为全函数的代码兑现。
实例:接受以0开头以1结尾的二进制串
本DFA接受首字符为0、末字符为1的二进制串。下图展示状态划分与转移规则。
实例:接受包含子串01的字符串
左侧方案A有4个状态(含冗余);右侧方案B合并冗余后仅3个状态——即该语言的最小DFA。
实例:只接受偶数个a和偶数个b的字符串
4状态DFA,由「积状态构造法」得来。每个状态编码一对奇偶(a的、b的)。从双圈出发,沿输入走,落在双圈即接收。
DFA的有限性限制
前面我们用 DFA 接受了偶数个 a、含子串 01 的串,现在挑战一个更自然的语言:aⁿbⁿ——n 个 a 后接 n 个 b。这种「先 n 个 a 再 n 个 b」的结构,让所有 DFA 都无能为力——为什么?
格数固定,再多一位就溢出归零,无法区分任意大小的 n
DFA vs NFA对比
非确定性听上去像额外能力——它真的让 NFA 识别更多语言吗?
- 转移函数 δ: Q×Σ → Q,每步唯一确定
- 读串时沿单一路径前行,无分支
- 走到终态即接受,否则拒绝
- 描述复杂语言时状态数膨胀明显
- 转移函数 δ: Q×Σ → 𝒫(Q),可多个下一状态
- 读串时并行探索所有可能路径
- 任意一条路径到达终态即接受
- 描述同等语言时状态数往往更少
DFA与上下文无关语言
前页 DFA 数偶数 a、偶数 b 还能撑住,但 a 和 b 一样多就彻底接不住。这不是 DFA 偶然掉链,而是能力边界注定——DFA 能识别的语言,恰好就是正则语言这一层。
算盘的物理结构决定它算不出开方——DFA 的有限状态就是它的物理结构,决定了它只能识别正则语言
核心概念自测
对于 DFA M = (Q, Σ, δ, q₀, F),字符串 w 被 M 接受的判定条件是?
DFA知识要点回顾
- ✓DFA=(Q,Σ,δ,q0,F),确定性=每步唯一走向
- ✓δ* 把字符级转移递归推广到字符串处理
- ✓正则语言 ≡ DFA可接受语言,二者互定边界
- ✓状态数有限 = DFA能力的根本约束
- ✓构造套路:识别状态、终态、转移三要素
课后思考
先遮住答案,给自己三分钟;想不清楚再看提示。
参考答案确定性保证给定输入只有一条执行轨迹,因此DFA可常数时间逐字符模拟。若允许多个转移,就必须同时探索所有可能,那就退化为NFA而非DFA了。
参考答案正则表达式直接构造DFA很繁琐,而NFA构造直观。NFA→DFA的子集构造可能状态爆炸,但这只是构建期成本;运行时DFA每字符O(1)查表,远快于NFA的回溯。
参考答案无限状态机能力远超DFA,但仍不够。典型例子:括号匹配DFA做不到,需要下推自动机(带栈)。要识别所有编程语言,需要图灵机(任意可读写存储)。