Skip to content

非确定性有限自动机

Nondeterministic finite automaton · NFA

以状态集合保留多条候选运行,并在至少一条运行接受时接受输入的有限状态模型。

条目类型
模型

形式陈述

非确定性有限自动机(NFA)是五元组 N=(Q,Σ,δ,q0,F)。它保留有限状态自动机的有限状态、初态与终态结构,但把转移改成

δ:Q×ΣP(Q),

其中 P(Q)Q幂集。后继集合可以为空,也可以同时含多个状态。本页的 NFA 每走一条边都恰好读取一个输入符号;允许不读取输入的 ε-边时,得到语法上更一般的 ε-NFA。

对状态集 SQ,把转移扩张到字:

δ^(S,ε)=S,δ^(S,wa)=qδ^(S,w)δ(q,a).

输入 w 被接受,当且仅当

δ^({q0},w)F.

等价地,在状态图中至少存在一条标签恰为 w、从 q0 走到 F 的路径。这里的量词是“存在接受运行”;只要一条路径成功,其他路径在中途消失或最终拒绝都不影响结果。

直觉

NFA 把尚未排除的解释同时保留下来。读到一个可能的模式起点时,可以让一条分支继续扫描普通文本,另一条分支尝试匹配模式;读到一个有多种语法角色的 token 时,也可以先分支,等后续输入提供证据。非确定性因此是一种描述上的延迟选择,而不是随机押注。

把运行想象成一组标记更接近实际模拟:开始只有 q0 上有标记,每读一个符号,所有标记沿相应边移动,落到同一状态的标记合并。某一步没有任何标记,说明所有候选都已失败;读完后只要接受态上仍有标记便接受。这套集合语义已经穷举所有分支,不需要一台真实机器“猜中”。

紧凑性来自共享。若许多候选具有公共前缀或公共后缀,NFA 可以让路径分叉再汇合,而 DFA 必须把所有当前活跃候选的组合编码进单个状态。共享会节省描述,却没有提供无界存储,因为 Q 的子集总共仍只有有限多个。

NFA 的分支运行前沿
例子与边界

要识别日志字节流中是否出现单词 ERROR,可以让初态在所有字符上自环,并在读到 E 时额外分叉到一条依次期待 RROR 的路径。错误起点的分支会死亡,初态分支继续寻找下一个 E;一旦某条候选走完整个单词,就进入接受自环。这个结构直接表达“存在某个起点使后续五个字符匹配”。

这个例子也揭示接受时刻的边界。如果接受态没有自环,而输入在 ERROR 后还有字符,该成功分支可能再次死亡,最终语言就变成“以 ERROR 结尾”而不是“包含 ERROR”。NFA 的接受条件在输入结束时检查,不能把中途经过接受态自动理解为整字接受。

非确定性不是概率:转移集合没有概率权重,也不存在“高概率接受”。它也不是并发程序的调度语义;多个分支只是一个字的多条证明路径。若把接受条件改成“所有分支都接受”,得到的是 universal 或交替语义,不能继续套用标准 NFA 的闭包和确定化结论。

补集不能靠直接翻转 NFA 的接受态获得。原语义问“是否存在接受分支”,翻转后问的是“是否存在原拒绝分支”,它并不等于“所有原分支都拒绝”。必须先确定化,使每个字只有唯一集合运行,再交换接受与拒绝。

存在真正的指数简洁性。语言

Ln={w{0,1}:w 的倒数第 n 个符号是 1}

n1 时可以用恰好 n+1 个状态的简单 NFA:机器猜测某个读到的 1 就是目标位置,再精确走完余下 n1 个符号。DFA 却必须记住最近 n 位的所有可能组合,最坏需要 2n 个可区分状态。

推论与应用

DFA既是 NFA 的语法特例,又与 NFA 在有限字识别能力上等价;子集构造把当前可能状态集变成确定状态。ε-NFA进一步允许无输入转移,适合拼接自动机片段;消去 ε-边后仍得到同一种正则语言。

词法规则合并、模式搜索和正则表达式编译常先生成 NFA,因为局部构造清晰且能共享路径。执行阶段可以逐字符维护状态集,也可以确定化为表驱动 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–2.4.
关系图谱13 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

上位 / 更一般

下位 / 直接特例

类型化关系