相关笔记: 13.2 带输出的有限状态机 | 13.4 语言识别
概览
本节介绍了不带输出的有限状态机,即有限状态自动机(finite-state automaton)。与第 13.2 节的带输出有限状态机不同,自动机没有输出,而是通过一组接受状态(accepting states)来判定输入字符串是否属于某个语言。本节首先引入字符串集合上的连接运算与Kleene 闭包,然后给出确定性有限自动机(DFA)的严格五元组定义,讨论其状态转移表、状态转移图以及扩展转移函数。接着介绍了非确定性有限自动机(NFA)的概念,并证明了 NFA 与 DFA 的识别能力等价(定理 1)。
- 字符串集合的连接:
- Kleene 闭包:,其中
- 有限状态自动机:五元组
- 状态转移函数:(确定性)或 (非确定性)
- 接受状态/最终状态:,字符串将起始状态带到接受状态则被识别
- ==语言 ==:自动机 识别的所有字符串的集合
- 等价自动机:识别相同语言的两个自动机
- NFA 与 DFA 等价:每个 NFA 识别的语言都可以被某个 DFA 识别
一、知识结构总览
graph TB A["13.3 不带输出的有限状态机<br>Finite-State Machines with No Output"] --> B["字符串集合的运算"] A --> C["确定性有限自动机 DFA"] A --> D["语言识别"] A --> E["非确定性有限自动机 NFA"] A --> F["DFA 与 NFA 的等价性"] B --> B1["连接 AB = {xy | x∈A, y∈B}"] B --> B2["幂 Aⁿ 的递归定义"] B --> B3["Kleene 闭包 A*"] C --> C1["五元组 M = (S, I, f, s₀, F)"] C --> C2["状态转移表"] C --> C3["状态转移图(双圈=接受状态)"] C --> C4["扩展转移函数 f: S×I* → S"] D --> D1["字符串被识别 ⟺ f(s₀, x) ∈ F"] D --> D2["语言 L(M) 的定义"] D --> D3["等价自动机"] D --> D4["设计 DFA 的技巧"] E --> E1["转移函数 f: S×I → P(S)"] E --> E2["状态子集作为 DFA 状态"] E --> E3["NFA 识别语言的定义"] F --> F1["定理1:NFA 识别的语言可被 DFA 识别"] F --> F2["子集构造法"]
二、核心思想
核心思想
本节的核心思想是用"接受状态"替代"输出"来实现语言识别。在带输出的有限状态机中,我们通过输出 或 来判断字符串是否属于目标语言;而在自动机中,我们只需检查处理完整个字符串后,机器是否停在接受状态。这种模型更简洁,且与形式语言理论中的核心概念(正则语言、正则表达式)直接对应。另一个重要思想是非确定性并不增加计算能力:NFA 允许在每个步骤有多个可能的转移,但通过”子集构造法”可以将任意 NFA 转化为等价的 DFA。
1. 字符串集合的运算
字符串集合的连接(Concatenation)
设 和 是 的子集( 为字母表),则 和 的连接定义为:
注意:一般情况下 。
连接运算
设 ,,则:
字符串集合的幂与 Kleene 闭包
设 ,定义:
- (仅含空串的集合)
- (递归定义,)
的Kleene 闭包(Kleene closure)定义为:
Kleene 闭包
- (所有由 和 组成的字符串)
- (由偶数个 组成的字符串)
2. 确定性有限自动机(DFA)
有限状态自动机(Finite-State Automaton)
一个有限状态自动机 由以下五部分组成:
- :有限状态集
- :有限输入字母表
- :转移函数,为每个(状态,输入)对指定唯一的下一状态
- :起始状态
- :接受状态集(也称最终状态集)
在状态转移图中,接受状态用双圈表示,起始状态用指向它的箭头标注 “Start” 表示。
扩展转移函数
转移函数 可以扩展为 ,递归定义为:
- ,对所有
- ,对所有 ,,
直观含义:从状态 开始,依次读取字符串 的每个符号,逐步转移。
语言识别
- 字符串 被 识别(或接受):
- 识别的语言:
- 两个自动机等价:它们识别相同的语言
确定自动机识别的语言
考虑自动机 :起始状态 ,接受状态 ,输入 和 都使 转移到自身。
则 。
等等——这里需要检查转移表。如果 和 都使 转移到 ,则 (所有字符串)。如果只有 使 转移到 ,则 。
设计 DFA:识别以两个 0 开头的位串
构造 DFA 识别 。
设计思路:
- :起始状态(尚未读入任何字符)
- :已读入一个 (非接受状态)
- :已读入两个 (接受状态),此后无论读入什么都留在
- :第一个字符为 (死状态),此后无论读入什么都留在
转移规则:,,,,,。
设计 DFA:识别含两个连续 0 的位串
构造 DFA 识别 。
设计思路:
- :起始状态(尚未看到连续的 )
- :最后一个字符是 (但前面不是连续的 )
- :已看到两个连续的 (接受状态),此后留在
转移规则:,,,,。
设计 DFA:识别以两个 0 结尾的位串
构造 DFA 识别 。
设计思路:
- :起始状态(尚未看到末尾的 )
- :最后一个字符是 (非接受状态)
- :最后两个字符都是 (接受状态)
转移规则:,,,,,。
DFA 设计方法论
设计 DFA 识别特定语言的一般步骤:
- 分析目标语言的特征:确定需要”记住”哪些信息(如已看到的字符数、奇偶性、末尾字符等)
- 为每种需要记忆的状态分配一个状态:DFA 的”记忆”完全由其当前状态体现
- 确定接受状态:哪些记忆状态对应”字符串属于目标语言”
- 补全转移函数:确保每个状态对每个输入符号都有转移
- 验证:用若干正例和反例测试自动机是否正确
3. 非确定性有限自动机(NFA)
非确定性有限自动机
一个非确定性有限自动机 的结构与 DFA 类似,但转移函数的值域不同:
即对于每个(状态,输入)对, 返回一个状态集合(可能为空、单元素或多元素),而非唯一状态。
在状态转移图中,一个状态可以有多条标有相同输入的边指向不同状态。
NFA 识别语言
字符串 被 NFA 识别,当且仅当存在从 出发、依次使用 作为输入的某条转移路径,最终到达 中的某个状态。
直观理解:NFA 在每一步可以”猜测”正确的转移方向;只要存在至少一条猜测路径到达接受状态,字符串就被识别。
NFA 与 DFA 的等价性(定理 1)
若语言 被某个 NFA 识别,则 也被某个 DFA 识别。
证明思路(子集构造法):
- DFA 的每个状态是 NFA 的状态集的一个子集
- 的起始状态为 ( 的起始状态构成的单元素集)
- 对于 中的状态 和输入 , 转移到
- 的接受状态是所有包含 接受状态的子集
- 若 识别 ,则存在一条路径使 从 到达接受状态,对应地 从 到达包含该接受状态的子集
注意: 最多有 个状态( 为 的状态数),但通常远少于此。
NFA 转化为 DFA
给定 NFA:,接受状态 ,转移为 ,,,,,,,,。
构造等价 DFA:起始状态 ,在输入 下转移到 ,在输入 下转移到 。 在输入 下转移到 (因为 经 到 , 经 到 )。接受状态包括 、、 等包含 或 的子集。
三、补充理解与易混淆点
补充理解
补充1:DFA 与 NFA 的等价性——子集构造法的实际意义
DFA 与 NFA 的等价性是自动机理论中最基础的结果之一,由 Rabin 和 Scott 于 1959 年证明。这一结论的实际意义在于:在理论分析中,NFA 通常更简洁、更容易构造(因为不需要处理”记住所有可能性”的复杂性);而在实际实现中(如正则表达式引擎),DFA 的确定性使其更适合硬件实现和高效的模式匹配。子集构造法是将理论上的简洁性转化为实际上的高效性的桥梁。然而,最坏情况下子集构造法会产生指数级的状态数,这也是正则表达式匹配可能出现”正则表达式拒绝服务攻击”(ReDoS)的理论根源之一。
来源:Rabin, M. O. & Scott, D. (1959). “Finite Automata and Their Decision Problems.” IBM Journal of Research and Development, 3(2), 114-125.
补充2:有限状态机的广泛应用
有限状态自动机不仅是理论计算机科学的基石,在实际工程中也有极为广泛的应用。在编译器设计中,词法分析器(lexer)本质上就是一个 DFA,用于从源代码中识别出标识符、关键字、数字常量等词法单元(token)。在网络协议中,TCP 协议的状态机就是一个有限状态自动机,用于管理连接的建立、数据传输和断开。在文本处理中,grep、sed 等工具的正则表达式匹配引擎底层也是基于有限状态自动机实现的。此外,在硬件设计中,有限状态机是数字电路控制逻辑的核心建模工具。
来源:Hopcroft, J. E., Motwani, R. & Ullman, J. D. (2006). Introduction to Automata Theory, Languages, and Computation (3rd ed.). Pearson.
易混淆点
误区1:NFA 比 DFA "更强大"
- ❌ 认为 NFA 能识别更多语言
- ✅ NFA 和 DFA 的识别能力完全等价(定理 1),NFA 只是描述更简洁
- NFA 的”非确定性”是构造上的便利,不增加计算能力
误区2:混淆接受状态与输出
- ❌ 将自动机的接受状态与带输出有限状态机的输出混淆
- ✅ 自动机没有输出;判断字符串是否被识别的唯一标准是最终状态是否属于
- 带输出有限状态机(Mealy/Moore 机)和自动机是不同的计算模型
误区3:忽略空串 的处理
- ❌ 忘记考虑空串是否被自动机识别
- ✅ 空串被识别当且仅当起始状态 本身就是接受状态()
- 在扩展转移函数中,,因此空串是否被识别完全取决于 是否在 中
四、习题精选
习题概览
题号范围 核心考点 难度 1-4 字符串集合的连接与 Kleene 闭包 ⭐ 9-10 判断字符串是否属于给定集合 ⭐⭐ 11-13 判断字符串是否被 DFA 识别 ⭐⭐ 16-22 确定给定 DFA 识别的语言 ⭐⭐ 23-37 设计 DFA 识别特定语言 ⭐⭐⭐ 43-49 确定给定 NFA 识别的语言 ⭐⭐ 50-54 NFA 转化为 DFA ⭐⭐⭐
题1:字符串集合的运算
题目
设 ,。求:(a) ;(b) ;(c) ;(d) 。
解答
(a)
(b)
(c)
(d) 。先算 。再算 ,共 个元素,每个长度为 。
题2:设计 DFA 识别含子串 “01” 的位串
题目
构造一个 DFA,识别所有含子串 的位串。
解答
状态设计:
- :起始状态,尚未看到可能形成 的前缀
- :最后一个字符是 (可能接下来出现 形成 )
- :已经看到子串 (接受状态)
转移函数:
( 表示起始状态, 表示接受状态)
题3:确定 DFA 识别的语言
题目
给定 DFA:,,,转移为 ,,,,,。求 。
解答
分析状态含义:
- :起始状态,尚未看到连续的
- :刚看到一个
- :已看到两个连续的 (接受状态,此后留在 )
因此 。
题4:NFA 转化为 DFA
题目
给定 NFA:,,,转移为 ,,,,,。构造等价的 DFA。
解答
使用子集构造法:
- 起始状态:
- ,
- (,,取并集),(,)
- ,
接受状态:(包含 )。
DFA 共有 3 个状态:、、。
题5:证明等价自动机
题目
证明以下两个 DFA 识别相同的语言:
- :,,其中 ,,,, 和 在任何输入下转移到自身
- :,,其中 ,, 在任何输入下转移到 , 在任何输入下转移到
解答
分析 :
- 从 经 到达 (接受状态):识别字符串
- 从 经 到 ,然后经若干 留在 ,再经 到达 (接受状态):识别 ()
- 因此
分析 :
- 从 经若干 留在 ,然后经 到达 (接受状态):识别 ()
- 一旦到达 ,后续输入转移到 (非接受状态),所以只有恰好一个 在末尾的字符串被识别
- 因此
,两者等价。
解题思路提示
有限状态自动机问题的解题方法论:
- 确定识别的语言:从起始状态出发,追踪各种可能的输入路径,归纳哪些字符串到达接受状态
- 设计 DFA:先确定需要”记住”的信息,为每种信息分配状态,再补全转移函数
- NFA 转 DFA:使用子集构造法,将 NFA 状态的子集作为 DFA 的状态
- 证明等价:分别分析两个自动机识别的语言,证明它们是同一集合
五、视频学习指南
视频资源
六、教材原文
教材原文
“A finite-state automaton consists of a finite set of states, a finite input alphabet , a transition function that assigns a next state to every pair of state and input (so that ), an initial or start state , and a subset of consisting of final (or accepting) states.”
“A string is said to be recognized or accepted by the machine if it takes the initial state to a final state, that is, is a state in .”
“A nondeterministic finite-state automaton consists of a set of states, an input alphabet , a transition function that assigns a set of states to each pair of state and input (so that ), a starting state , and a subset of consisting of the final states.”
“If the language is recognized by a nondeterministic finite-state automaton , then is also recognized by a deterministic finite-state automaton .”
—— Rosen, Section 13.3, pp. 904-914