- 闭包与 计算

- 闭包:从状态 出发,仅通过 边可达的所有状态集合。

计算:从状态集 出发,经输入 (允许中间 转移)到达的状态集:

- 闭包三步计算法

  1. 初始:
  2. ,则将 加入
  3. 重复直到 不再增大

重点 - 闭包和 计算是子集构造法的基础。

子集构造法(NFA → DFA)

定理 NFA 等价 DFA(二者识别的语言相同)。

算法步骤

  1. 从 NFA 初态 出发,计算 ,作为 DFA 的初态
  2. 对每个新产生的 DFA 状态 ,对每个 计算
  3. 尚未存在,则加入 DFA 状态集
  4. 重复直至无新状态产生
  5. 含有 NFA 终态的 DFA 状态标记为终态
  6. 重命名 DFA 状态

示例:NFA 有状态 - 闭包计算后得到 DFA 状态 , , 等。

重点 子集构造法是 NFA 确定化的标准算法,常嵌入综合大题。

DFA 最小化(两步法)

第一步:删除不可达状态

从初态出发做 DFS/BFS,标记所有可达状态,删除不可达状态及其出边。

重点 不可达状态检测(DFS 遍历)。

第二步:划分法合并等价状态

等价状态,从 出发读入 后,要么都接受、要么都拒绝。

划分法步骤

  1. 初始划分(终态集 vs 非终态集)
  2. 细化:对每个组 ,若 中状态对某个 转移到不同组,则分裂
  3. 重复直到所有组不再分裂
  4. 每个组内状态等价,合并为一个状态

示例: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
状态01
(出现0)(末尾1)
死状态(连续0,拒绝)(末尾变1)