664 字
3 分钟
[形式语言与自动机] NFA非确定有穷自动机

非确定有穷自动机的定义#

非确定有穷自动机(NFA)是一个五元组:

A=(Q,Σ,δ,q0,F)A = (Q, \Sigma, \delta, q_0, F)

其中:

  • QQ 是一个有限的状态集合
  • Σ\Sigma 是一个有限的输入符号集合(字母表)
  • δ:Q×(Σ{ϵ})2Q\delta: Q \times (\Sigma \cup \{\epsilon\}) \to 2^Q 是状态转移函数,定义了在给定状态和输入符号的情况下,自动机可以转移到哪些下一个状态。这里,ϵ\epsilon表示空字符串,允许自动机在没有输入符号的情况下进行状态转移
  • q0Qq_0 \in Q 是初始状态
  • FQF \subseteq Q 是终结状态集或接受状态集合

其中和DFA的区别在于δ\delta的定义,DFA的δ\delta是一个函数,定义了每个状态和输入符号对应一个唯一的下一个状态,而NFA的δ\delta是一个多值函数,定义了每个状态和输入符号对应一组可能的下一个状态

条件#

  1. 转移是非确定的:对于每个状态 qQq \in Q 和每个输入符号 aΣa \in \Sigma,转移函数 δ(q,a)\delta(q, a) 定义了一组可能的下一个状态
  2. NFA在任何时候可以处于多个状态
  3. NFA接受一个字符串,如果从初始状态出发,按照输入字符串的符号进行状态转移,最终停在一个接受状态上
  4. NFA拒绝一个字符串,如果从初始状态出发,按照输入字符串的符号进行状态转移,最终停在一个非接受状态上
  5. NFA可以有ε-转移,即可以在没有输入符号的情况下进行状态转移

关系#

  1. 每个DFA都是一个NFA,因为DFA的转移函数满足NFA的定义
  2. 每个NFA都可以转换成一个等价的DFA,虽然转换可能会导致状态数量的指数增长
  3. DFA和NFA接受同样的语言,即它们识别的语言类是相同的,称为正则语言

对于NFA的δ\delta的理解可以参考类UNIX系统调用的fork,NFA的δ\delta就类似于fork,允许自动机在当前状态下分叉成多个状态

转换成DFA-子集构造法#

e.g.

现有一NFA如下:

状态输入0输入1
q0\rightarrow q_0{q0,q1}\{q_0, q_1\}{q0}\{q_0\}
q1q_1{q2}\{q_2\}{q1}\{q_1\}
q2\ast q_2{q2}\{q_2\}{q2}\{q_2\}

通过子集构造法得到DFA:

状态输入0输入1
{q0}\rightarrow \{q_0\}{q0,q1}\{q_0, q_1\}{q0}\{q_0\}
{q0,q1}\{q_0, q_1\}{q0,q1,q2}\{q_0, q_1, q_2\}{q0,q1}\{q_0, q_1\}
{q0,q1,q2}\ast \{q_0, q_1, q_2\}{q0,q1,q2}\{q_0, q_1, q_2\}{q0,q1,q2}\{q_0, q_1, q_2\}

也就是把状态的集合作为一个新状态,每次输入后把所有输出收集起来拼成一个集合作为新的状态,直到没有新的状态产生为止

[形式语言与自动机] NFA非确定有穷自动机
https://a1kari8.github.io/posts/automata/nfa/
作者
A1kari8
发布于
2026-05-30
许可协议
CC BY-NC-SA 4.0