确定有限自动机

官方信息技术老师·26 页·深入(追求细节与边界)·0 次浏览·2 天前
形式语言自动机理论正则语言计算模型

确定有限自动机

从五元组定义到最小化与等价性,彻底搞懂 DFA 识别正则语言的边界

按 空格/→ 演示下一步

1 / 26 页

全部页面点击任意一页,跳回舞台从这页播放

形式语言自动机理论正则语言计算模型

确定有限自动机

从五元组定义到最小化与等价性,彻底搞懂 DFA 识别正则语言的边界

1第 1 页 · 确定有限自动机

什么是有限自动机

上页我们见过确定有限自动机——下一步永远唯一的那种机器。但「自动机」三个字到底是什么意思?先把确定的限制摘掉,从更朴素的角度看:什么是有限自动机?

状态
机器任意时刻所处的「处境」,可枚举、有限个
输入
来自外部的离散符号,只被读取,不被解释
转移
(当前状态,输入)→ 下一状态,由规则表唯一敲定
写字楼的电梯对应 →有限自动机

楼层=状态,按钮=输入,控制板决定怎么动

2第 2 页 · 什么是有限自动机

为什么需要「确定」二字

同样投 5 角按 A,结果时而是可乐时而是橙汁——这种机器你敢用吗?这正是 NFA 的窘境。DFA 用「确定」二字,把下一状态钉死为唯一,彻底消除这种不可预测。

与 NFA 对比
NFA 允许 ε 转移,同一输入符号下可有多条候选路径
唯一后继
每个状态对每个输入符号至多只有一个下一状态
路径可预测
给定输入串,从起点出发每一步走向都唯一确定
实现简单
一张二维转移表 δ[状态][符号]=状态 即可存下全部
数学函数 f(x)对应 →DFA 转移函数 δ(q,a)

函数对每个 x 给唯一 y;NFA 像「关系」,同一 x 可映到多个 y

δDFA:Q×ΣQ, δNFA:Q×Σ2Q\delta_{DFA}: Q\times\Sigma \to Q,\ \delta_{NFA}: Q\times\Sigma \to 2^Q
3第 3 页 · 为什么需要「确定」二字

DFA的五元组定义

前几页我们用直觉理解了DFA——状态有限、读符号、一步步跳。要严谨地描述它『长什么样、怎么工作』,需要五个分量说清楚:M=(Q,Σ,δ,q₀,F)。

Q (状态集)
有限非空集合,DFA所有可能停留的状态
Σ (字母表)
有限非空符号集,DFA能读懂的所有字符
δ (转移函数)
δ:Q×Σ→Q,给定当前状态和输入符号,下一状态唯一
q₀ (初始状态)
q₀∈Q,DFA启动时唯一所在的起始状态
F (接受集)
F⊆Q,运行结束后停留其中即判定为接受
自动售货机对应 →DFA的五元组

按钮面板=Σ,机内状态=Q,按键逻辑=δ,待机态=q₀,出货完成=F

M=(Q,Σ,δ,q0,F), δ:Q×ΣQM=(Q,\Sigma,\delta,q_0,F),\ \delta:Q\times\Sigma\to Q
4第 4 页 · DFA的五元组定义

DFA定义各分量详解

中间三圆点是Q,左侧两符号是Σ,三条虚线引出q₀、F、δ标注。

图解渲染中…
n0q₀:圆角节点,整张图唯一n2F 中的接受状态,画成双圆lblDδ 由所有有向边共同定义symAΣ 的输入符号,决定边的标签
5第 5 页 · DFA定义各分量详解

状态转移图的画法

把五元组四个分量逐一对应到图上的圆节点、源箭头、带标签弧、双圈上。

图解渲染中…
s无标签源箭头指向起始状态q0q0单圆=一般状态,来自状态集Qq2双圆=接受态,属于终态集Fq1->q2弧上标签=δ(q,a)中的输入符号a
6第 6 页 · 状态转移图的画法

扩展转移函数的递归定义

把只能吃一个字符的 δ 扩展成能处理整个字符串的 δ̂,靠两条递归子句。

1
问题起点
δ 只能对单个符号 a 求下一状态,无法直接处理字符串 w
2
基底子句
δ̂(q,ε)=q:读空串等于原地不动,作为递归的锚点
3
归纳子句
δ̂(q,wa)=δ(δ̂(q,w),a):先递归吃完前缀 w,再多读一字符 a
4
良定义保证
对串长做归纳,每一步都唯一确定下一状态,递归必终止
7第 7 页 · 扩展转移函数的递归定义

扩展转移函数的工作原理

输入固定为 010;从左到右看递归的逐层展开。节点是“当前结果 / 已读前缀”,边表示本次调用基础转移函数 δ。

图解渲染中…
a0递归入口;只展示输入 010 所需的转移。a1递归基:空串不改变状态。a2处理首个字符 0 后得到 q1。a4完整输入 010 的扩展转移结果。
8第 8 页 · 扩展转移函数的工作原理

DFA如何接受字符串

扩展转移函数告诉我们:给定任意字符串,从q0出发总能走到唯一确定的终点。但走到哪里才算是「成功」?这就要靠接受集F来下结论了。

从q0出发
一切接受的起点必须是初始状态q0,其他状态出发的轨迹不算接受
按字符逐步转移
用扩展转移函数δ̂,每读一个字符转移一次,走完整串
终点落入接受集F
走完后停留的状态必须属于接受集F,否则就是拒绝
DFA的语言L(M)
所有被接受字符串的全体,构成DFA所能识别的语言
坐地铁到终点站对应 →DFA接受字符串

q0是起点站,字符串每个字符是车票上的站名,F是终点站集合,能到终点算走对路线

L(M)={wΣδ^(q0,w)F}L(M) = \{ w \in \Sigma^* \mid \hat{\delta}(q_0, w) \in F \}
9第 9 页 · DFA如何接受字符串

接受与拒绝的判定过程

看 DFA 如何决定取舍:串 '01' 与 '10' 走同一机器,差在最终落入何态。

图解渲染中…
q2★ 标记的为终态(接受态)q0q0 读 '1' 自环回到自身
10第 10 页 · 接受与拒绝的判定过程

DFA的语言定义

上一页我们对单条字符串判定「接受/拒绝」。把所有被接受的字符串拢成一个集合,就是这台 DFA「认识」的语言。

L(M) 记号
机器 M 所识别的语言:所有被它判为接受的字符串的集合
集合构造式
用 {w | 条件} 写法刻画集合中的元素及其必须满足的性质
接受条件
从初态 q₀ 出发,沿 w 转移后所到的状态属于终态集 F
w 的取值范围
w 取遍字母表 Σ 上的所有字符串,即 w ∈ Σ*
L(M) 的本质
它是 Σ* 的一个子集,称为 Σ 上的一个形式语言
门卫核验访客证件对应 →DFA 接受一个字符串

证件上的字符被门卫逐位过目(对应 δ̂ 一步接一步),最终请进门 ≡ 落在终态 F

L(M)={wΣδ^(q0,w)F}L(M) = \{w \in \Sigma^* \mid \hat{\delta}(q_0, w) \in F\}
11第 11 页 · DFA的语言定义

正则语言的概念

上页我们把DFA的语言 L(M) 定义为机器接受的所有字符串的集合。现在把所有能被某个DFA接受的语言归为一类,给个名字——正则语言。这是从机器视角到语言视角的一次切换。

正则语言的定义
语言L是正则语言⟺存在DFA M使L = L(M)
判定等价
问L是否正则,等价于问是否存在DFA接受L——双向等价命题
DFA不唯一
同一个正则语言可被无穷多台不同的DFA接受(最小化后才唯一)
语言的视角
正则性是语言本身的性质,与具体哪台DFA无关
能被2整除的整数对应 →能被DFA接受的语言

给一类具有共同性质的集合命名:偶数=能被2整除的整数;正则语言=能被DFA接受的语言

L 是正则语言    DFAM,  L=L(M)L\text{ 是正则语言} \iff \exists\,\text{DFA}\,M,\; L = L(M)
12第 12 页 · 正则语言的概念

正则语言与正则表达式

正则语言是「对象」,正则表达式是描述它的「笔」——初学者常混为一谈,搞清关系才能理解等价性定理。

正则语言
  • 本质:串的集合(数学对象)
  • 定义:被某 DFA 接受的所有串
  • 唯一性:客观存在,与描述方式无关
  • 关注问题:L 是否属于正则类
正则表达式
  • 本质:递归书写的记号(语法工具)
  • 定义:从字母表按 | · * 递归构造
  • 多重性:多个式子可描述同一语言
  • 关注问题:怎样写出 L 的具体式子
对象 vs 笔:正则语言是「被描述的集合」,正则表达式是「描述它的记号」。描述能力等价(Kleene 定理),但抽象层次不同。
13第 13 页 · 正则语言与正则表达式

正则语言的封闭性

上一页我们确认正则语言与正则表达式等价。现在换个角度:两个正则语言摆在面前,能不能并起来、交起来、取反、拼接?拼出来的还是正则语言吗?

封闭性定义
一族语言对某运算封闭:输入皆在族内时,输出也在族内
并与交封闭
L₁∪L₂ 与 L₁∩L₂ 仍是正则语言;可用积自动机证明
补运算封闭
¬L 仍是正则语言;只需把 DFA 的终态与非终态互换
连接与闭包
L₁L₂ 与 L₁* 仍是正则语言;可由 NFA 转换或正则式直接推出
整数加整数还是整数对应 →正则语言运算后还是正则语言

「封闭」=运算结果没跑出原集合;整数对加法封闭、对除法不封闭

L1,L2R    L1L2, L1L2, L1, L1L2, L1RL_1, L_2 \in \mathcal{R} \implies L_1 \cup L_2,\ L_1 \cap L_2,\ \overline{L_1},\ L_1 L_2,\ L_1^* \in \mathcal{R}
14第 14 页 · 正则语言的封闭性

从状态转移图构造DFA

图是DFA的可视化语言,五元组是它的形式化语言。这页教你把图'翻译'回五元组,五步走完不重不漏。

1
列出状态集Q
扫描图中所有节点,给每个圈命名或编号,这就是状态集合
2
确定字母表Σ
把所有转移箭头上的输入符号收集起来,去重得到字母表
3
标出初态和终态
无源箭头指向初态 q0,双圈节点全部归入终态集 F
4
写出转移函数δ
对每个状态和每个字母表符号,从图中读出箭头指向的唯一目标
5
汇总五元组
按 M=(Q,Σ,δ,q0,F) 的顺序整理出DFA的完整形式化定义
15第 15 页 · 从状态转移图构造DFA

从语言描述构造DFA

把自然语言描述的语言翻译成DFA,本质上是把约束条件编码进状态与转移里。

1
拆解约束
把语言描述拆成若干可判定的具体条件,如长度、字符顺序、出现次数
2
设计状态
把需要记住的关键信息一一对应为状态
3
设定初态
代表尚未读取任何输入,是所有合法串的共同起点
4
设计转移
对每个状态和字符的组合,依据约束决定下一状态
5
标记接受态
读完全部输入后,满足所有约束的状态标为接受态
6
验证修正
用边界用例检验,必要时回头调整状态或转移
16第 16 页 · 从语言描述构造DFA

DFA的实现:状态转移表

python

把 δ 物化为一颗字典,逐字符查表即完成模拟。

代码高亮加载中…

转移表把 δ: Q×Σ→Q 存成有限字典;逐字符 O(1) 查表推进状态,字母表守卫保证了「每读一个符号都能找到下一个状态」——这是 DFA 定义中 δ 为全函数的代码兑现。

17第 17 页 · DFA的实现:状态转移表

实例:接受以0开头以1结尾的二进制串

本DFA接受首字符为0、末字符为1的二进制串。下图展示状态划分与转移规则。

图解渲染中…
a1起始态:尚未读入任何字符a2中间态:已读到首字符0,但末字符不是1a3接受态(双圈):首字符为0且末字符为1a4死状态:首字符为1,所有后续输入都不再离开
18第 18 页 · 实例:接受以0开头以1结尾的二进制串

实例:接受包含子串01的字符串

左侧方案A有4个状态(含冗余);右侧方案B合并冗余后仅3个状态——即该语言的最小DFA。

图解渲染中…
a3方案A的接受态——见到01即停此a4方案A的冗余态,行为可被a3覆盖b3方案B合并后的接受态,与a3行为等价a2末位为0——正在等待下一个1
19第 19 页 · 实例:接受包含子串01的字符串

实例:只接受偶数个a和偶数个b的字符串

4状态DFA,由「积状态构造法」得来。每个状态编码一对奇偶(a的、b的)。从双圈出发,沿输入走,落在双圈即接收。

图解渲染中…
a1起点也是接收点:a和b各为偶数个a3读a时a的奇偶翻转(偶↔奇),b不变a2读b时b的奇偶翻转(偶↔奇),a不变
20第 20 页 · 实例:只接受偶数个a和偶数个b的字符串

DFA的有限性限制

前面我们用 DFA 接受了偶数个 a、含子串 01 的串,现在挑战一个更自然的语言:aⁿbⁿ——n 个 a 后接 n 个 b。这种「先 n 个 a 再 n 个 b」的结构,让所有 DFA 都无能为力——为什么?

有限状态 = 有限记忆
每个状态只能编码有限信息,N 个状态至多区分 N 种历史
计数本质需无穷记忆
要识别 aⁿbⁿ,读完所有 a 后必须「记住 n」,但 n 无上界
aⁿbⁿ 不可被 DFA 接受
无论 DFA 有多少状态,总存在更大的 n 让它失败
位数固定的机械计数器对应 →有限状态 DFA

格数固定,再多一位就溢出归零,无法区分任意大小的 n

L={anbnn0}L = \{ a^n b^n \mid n \geq 0 \}
21第 21 页 · DFA的有限性限制

DFA vs NFA对比

非确定性听上去像额外能力——它真的让 NFA 识别更多语言吗?

DFA · 确定性
  • 转移函数 δ: Q×Σ → Q,每步唯一确定
  • 读串时沿单一路径前行,无分支
  • 走到终态即接受,否则拒绝
  • 描述复杂语言时状态数膨胀明显
NFA · 非确定性
  • 转移函数 δ: Q×Σ → 𝒫(Q),可多个下一状态
  • 读串时并行探索所有可能路径
  • 任意一条路径到达终态即接受
  • 描述同等语言时状态数往往更少
二者识别能力完全等价(都是正则语言),但 NFA 便于构造,DFA 便于实现。
22第 22 页 · DFA vs NFA对比

DFA与上下文无关语言

前页 DFA 数偶数 a、偶数 b 还能撑住,但 a 和 b 一样多就彻底接不住。这不是 DFA 偶然掉链,而是能力边界注定——DFA 能识别的语言,恰好就是正则语言这一层。

能力天花板
DFA 能识别的语言恰好就是正则语言,无法越界
谱系定位
正则语言是乔姆斯基层级最底层,往上每一层都严格更大
CFL 严格更大
L = {aⁿbⁿ | n ≥ 0} 可由 CFG 描述,但任何 DFA 都接不住
需要换工具
上下文无关语言对应下推自动机 PDA,DFA 缺栈故处理不了嵌套
三工具等价
DFA、NFA、正则表达式三者互相等价,共同刻画正则语言
算盘对应 →DFA

算盘的物理结构决定它算不出开方——DFA 的有限状态就是它的物理结构,决定了它只能识别正则语言

LREGLCFGLCSGLREL_{\text{REG}} \subsetneq L_{\text{CFG}} \subsetneq L_{\text{CSG}} \subsetneq L_{\text{RE}}
23第 23 页 · DFA与上下文无关语言

核心概念自测

点击作答

对于 DFA M = (Q, Σ, δ, q₀, F),字符串 w 被 M 接受的判定条件是?

24第 24 页 · 核心概念自测

DFA知识要点回顾

  • DFA=(Q,Σ,δ,q0,F),确定性=每步唯一走向
  • δ* 把字符级转移递归推广到字符串处理
  • 正则语言 ≡ DFA可接受语言,二者互定边界
  • 状态数有限 = DFA能力的根本约束
  • 构造套路:识别状态、终态、转移三要素
延伸主题:非确定有限自动机NFA正则表达式与DFA等价泵引理论证非正则语言
25第 25 页 · DFA知识要点回顾

课后思考

先遮住答案,给自己三分钟;想不清楚再看提示。

1为什么DFA必须在每个状态下对每个输入符号都有且仅有一个转移?

参考答案确定性保证给定输入只有一条执行轨迹,因此DFA可常数时间逐字符模拟。若允许多个转移,就必须同时探索所有可能,那就退化为NFA而非DFA了。

2词法分析常把正则表达式先转NFA再转DFA。既然DFA可能状态爆炸,为什么不直接构造DFA?

参考答案正则表达式直接构造DFA很繁琐,而NFA构造直观。NFA→DFA的子集构造可能状态爆炸,但这只是构建期成本;运行时DFA每字符O(1)查表,远快于NFA的回溯。

3DFA的「有限」指状态数有限。若取消这个限制,无限状态机能否识别所有编程语言?

参考答案无限状态机能力远超DFA,但仍不够。典型例子:括号匹配DFA做不到,需要下推自动机(带栈)。要识别所有编程语言,需要图灵机(任意可读写存储)。

26第 26 页 · 课后思考
确定有限自动机 · 知识图解