Skip to content

定理Theorem

DFA–NFA 等价定理

DFA–NFA equivalence · Subset construction

每个 NFA 都能以当前可能状态集为一个 DFA 状态,从而在有限字上保持语言不变。

形式陈述 ​

每台NFA 都存在一台识别同一语言的DFA;反方向成立是因为 DFA 的唯一后继可视为 NFA 的单元素后继集合。因此两种模型在有限字上的表达能力相同。

具体地,设

N=(Q,Σ,δ,q0,F).

子集构造以 Q 的幂集为候选状态,得到

D=(P(Q),Σ,Δ,{q0},FD),

其中

Δ(S,a)=⋃q∈Sδ(q,a),FD={S⊆Q:S∩F≠∅}.

真正构造时只需从 {q0} 搜索可达子集,不必预先枚举整个幂集。空集若可达就是合法死状态,因为 Δ(∅,a)=∅。

证明的核心不变量是:对每个 w∈Σ∗,

Δ∗({q0},w)=δ^({q0},w).

空字时两边都是 {q0}。若等式对 w 成立,那么读下一个符号 a 后,两边都把当前集合中每个 NFA 状态的 a-后继取并,因此对 wa 也成立。归纳完成后,DFA 的集合状态与 F 相交,恰好等价于 NFA 至少有一条接受运行。

若输入机器含ε-边,初态改为 E({q0}),转移改为

Δ(S,a)=E(⋃q∈Sδ(q,a)),

同一不变量仍成立,只是集合始终保持 ε-闭合。

直觉

非确定性运行在一个时刻可能位于多个状态,确定化便把“这整组可能位置”命名为一个确定状态。每读一个符号,所有候选同时前进,重复位置自动合并。原来藏在路径分叉中的信息没有消失,而是显式搬进了集合状态。

接受集合为何采用“与 F 相交”也由此一目了然:NFA 只要求存在一条成功路径,所以活跃集合中出现任一接受态就足够。若误写成 S⊆F,就把存在语义改成了所有活跃分支都接受。

定理只承诺存在等价表示,不承诺表示同样简洁。NFA 用一张共享图表示许多候选的组合;DFA 为每个会影响未来的组合准备独立状态。确定化把运行时维护的集合预先编译成表,换来每个字符一次确定跳转,也可能付出指数空间。

子集不同不代表未来行为不同:A、B 同属 U;E 可由 ba 到达。
例子与边界

从六态 NFA 算出五个可达子集 ​

固定字母表 Σ={a,b},考虑语言

L={akb:k≥0}∪{akbb:k≥0}=a∗b(ε∣b).

它允许先读任意多个 a,再读恰好一个或两个 b。下面的 NFA 把这两个可能性交给不同分支;初态是 s,接受集是 F={f,h}。本例没有 ε-边,表中的空集表示该分支不能继续。

状态 读 a 读 b 接受
s {p,q} {f,g} 否
p {p} {f} 否
q {q} {g} 否
f ∅ ∅ 是
g ∅ {h} 否
h ∅ ∅ 是

p,f 负责一个 b 的分支,q,g,h 负责两个 b 的分支。首次读取 a 时,s 同时激活 p,q;若首字符就是 b,则直接到 f,g。读到第一个 b 时,f 已接受,g 仍在等待第二个 b,所以集合里无需每个状态都接受。

现在真正执行可达搜索。队列起初只有 A={s},按 a,b 顺序展开:处理 A 发现 B={p,q} 和 C={f,g};处理 B 不产生新集合;处理 C 发现 E=∅ 和 D={h};处理 E,D 后不再增加状态。记录每个新集合一次,就得到下表。

子集状态 一个到达前缀 读 a 读 b 接受
A={s} ε B C 否
B={p,q} a B C 否
C={f,g} b E D 是
D={h} bb E E 是
E=∅ ba E E 否

例如 Δ(C,b)=δ(f,b)∪δ(g,b)=∅∪{h}=D。表中十条转移都落在这五行内,且每一行都有到达见证,因此它们恰好是全部可达状态。虽然幂集含 26=64 个候选,本次只需生成五个;原图中 p 可达,却不能据此说单元素子集 {p} 可达,因为从初态读 a 必然同时激活 q。

输入 aaabb 的集合轨迹为

{s}→a{p,q}→a{p,q}→a{p,q}→b{f,g}→b{h}.

最终接受。对应的一条成功 NFA 路径是 s,q,q,q,g,h;另一分支在第二个 b 上消失。若再追加任一字符,前沿变为空集并拒绝。这解释了为什么“中途曾经接受”不能替代最终接受条件。

还可直接按前缀形状检查整张表:空字到 A,非空纯 a 串到 B,a∗b 到 C,a∗bb 到 D,其余字到 E。这五种情形穷尽输入,且恰有中间两个含 b 的合法形状接受,从而验证所得语言正是 L。

确定化至此已经完成,但 A,B 的不同集合名称未必表示不同未来行为。最小化会继续把它们合并;Nerode 证书则证明剩下四种行为确实不能再少。集合构造负责保存全部分支,最小性要另行证明。

空集、成本与指数边界 ​

本例的空集可由 ba 到达,是一个必需的拒绝死状态;删除它后表就不再是总函数。也有空集不可达的情况:在字母表 {a} 上,一个接受态的 a 自环识别 a∗,确定化始终停在同一个单元素集合,无需额外制造可达死状态。

设 NFA 有 n 个状态、k 个显式输入字符,实际生成 R≤2n 个子集。若一个 n 位集合能放进一个机器字,并预存每个状态、字符的后继位掩码,简单实现扫描每个子集的至多 n 个成员并取按位或,构造时间为 O(Rkn);用期望常数时间的哈希表驻留集合,空间为 O(kn+R+Rk) 个机器字。本例需要计算的是五行十项,而不是先填六十四行。

上述成本依赖集合能放进单个机器字。若需要 b=⌈n/W⌉ 个字,上述直接实现的一次集合合并、哈希与比较都不再是常数成本,稠密实现的时间界可写为 O(Rknb)。完成显式 DFA 表之后,执行一个输入才只需 O(|w|) 次查表;执行成本并未包含确定化的编译工作。

上界 2|Q| 在最坏情形不可改成多项式。对

Ln={w∈{0,1}∗:w 的倒数第 n 位为 1},

NFA 可以在读到某个 1 时猜它是目标位,再数完余下 n−1 个字符;DFA 则必须区分所有长度为 n 的最近后缀,因为其中任意两个不同后缀都能通过适当续写让目标位暴露出来。于是某些 O(n) 状态 NFA 的最小等价 DFA 确需 2n 级状态。

不是每个子集都会出现,甚至指数上界常常极松。按需搜索可达子集能避免无用状态,却无法回避语言本身确有指数多种未来行为的情形。最小化也只能合并未来行为相同的可达子集,不能突破 Myhill–Nerode 给出的真实下界。

推论与应用

同一集合不变量也能沿树结构归纳:有限树自动机把每个孩子的可能状态集合合并为父集合,从而完成自底向上的确定化。该结论不能直接改成确定性自顶向下识别;后者先分派孩子状态,在“至少有一个 a 叶子”的语言上已有严格限制。

沿无限字运行时,可达子集仍准确表示当前可能位置,却未必保存“同一条运行无限次接受”的历史。Safra确定化的两状态例子在a与b上得到相同子集,长期接受却不同;命名树补入的正是这些跨轮进展信息,而非修正本页有限字集合不变量。

等价定理把 NFA 纳入正则语言的统一定义,使依赖唯一运行的补集、乘积、等价判定和最小化都能先经确定化应用。它也是Kleene 定理翻译链的中段:正则表达式先产生 ε-NFA,再由闭包子集构造得到 DFA。

工程实现可以把构造提前或延后。词法分析器生成器通常预先构造可达 DFA 子集以换取固定吞吐;内存敏感的模式匹配器可以用位集实时维护 NFA 状态;混合实现则只在运行遇到新集合时缓存对应转移。三种策略共享同一个集合不变量。

参考资料
  • M. O. Rabin and D. Scott, “Finite Automata and Their Decision Problems”, 1959,印刷第 121 页,Definition 11 与 Theorem 11:子集构造及语言保持证明。

  • Cornell CS4120, “Automating Lexical Analysis”, Spring 2023,“NFA to DFA”节:ε-闭包与可达子集的构造。

  • Michael Sipser, Introduction to the Theory of Computation, 3rd ed., Cengage, 2013, §1.2.

  • John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, 3rd ed., Pearson, 2006, §2.3.

关系图谱10 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系