- 闭包与 计算
- 闭包:从状态 出发,仅通过 边可达的所有状态集合。
计算:从状态集 出发,经输入 (允许中间 转移)到达的状态集:
- 闭包三步计算法
- 初始:
- 若 且 ,则将 加入
- 重复直到 不再增大
重点 - 闭包和 计算是子集构造法的基础。
子集构造法(NFA → DFA)
定理: NFA 等价 DFA(二者识别的语言相同)。
算法步骤:
- 从 NFA 初态 出发,计算 ,作为 DFA 的初态
- 对每个新产生的 DFA 状态 ,对每个 计算
- 若 尚未存在,则加入 DFA 状态集
- 重复直至无新状态产生
- 含有 NFA 终态的 DFA 状态标记为终态
- 重命名 DFA 状态
示例:NFA 有状态 ,- 闭包计算后得到 DFA 状态 , , 等。
重点 子集构造法是 NFA 确定化的标准算法,常嵌入综合大题。
DFA 最小化(两步法)
第一步:删除不可达状态
从初态出发做 DFS/BFS,标记所有可达状态,删除不可达状态及其出边。
重点 不可达状态检测(DFS 遍历)。
第二步:划分法合并等价状态
等价状态:,从 和 出发读入 后,要么都接受、要么都拒绝。
划分法步骤:
- 初始划分:(终态集 vs 非终态集)
- 细化:对每个组 ,若 中状态对某个 转移到不同组,则分裂
- 重复直到所有组不再分裂
- 每个组内状态等价,合并为一个状态
示例:7 状态 DFA 经划分法 5 状态最小化 DFA;3 状态 DFA 可 2 状态。
重点 划分法初始划分为终态集和非终态集,逐步细化至不动点。
完整流程:RE NFA DFA 最小化 DFA。
DFA 设计典型例题
例 1:含 “001” 的二进制串
设计 DFA,识别所有含子串 “001” 的二进制串。
思路:记录已匹配到 “001” 的前缀长度,分为 4 个状态:
- (初态):尚未匹配任何 “001” 前缀(或已重置)
- :已匹配到 “0”
- :已匹配到 “00”
- (终态):已匹配到 “001”,此后任意字符均接受
状态转移:
| 状态 | 输入 0 | 输入 1 |
|---|---|---|
| (匹配到第一个0) | (未匹配) | |
| (匹配到00) | (1打断,重置) | |
| (继续等1) | (匹配到001) | |
| (已匹配) | (已匹配) |
重点 DFA 设计题需根据识别目标设计状态含义,确定转移关系后画状态图。
例 2:不含 “00” 的二进制串
,不含连续两个 0 的串。
- (初态/终态):末尾为 1(或空串)
- (终态):末尾为 0
| 状态 | 0 | 1 |
|---|---|---|
| (出现0) | (末尾1) | |
| 死状态(连续0,拒绝) | (末尾变1) |