算法与数据结构 / 有限自动机 · DFA / NFA / regex 与它们之间的转换 / NFA:同时身处一群 state 待审核 2 / 7
NFA · 非确定 · ε-transition · 集合模拟

NFA:同时身处一群 state

nondeterministic finite automaton 放宽了 DFA 的两条限制:同一个(状态,字符)可以有多个去向、也可以一个都没有;另外多出一种 ε-transition,不读任何字符就能转移到另一个状态。于是「机器现在在哪」不再是一个状态,而是同时处于一组状态。

1 · 集合模拟

运行一台 NFA 用的是 subset simulation:始终维护当前所有可能所处的状态集合。起步时集合是 ε-closure({q0})\varepsilon\text{-closure}(\{q_0\})。每读一个字符 cc 做两步,先 move,即集合里每个状态沿 cc 边走一步后取并集;再取 ε-closure\varepsilon\text{-closure},把沿 ε 边可达的状态全部并入。读完时集合只要包含任一 accept state 即接受,即「存在一条成功路径」。

图 1-1 · (a|b)*abb 的 NFA 在集合模拟下的运行。可逐字符推进,观察高亮的状态集合随每个字符扩张与收缩。

图 1-1 的机器读到第一个 abb 之前的字符时会分叉:在 s0 上它既能留在 s0(假定该字符不是 abb 的开头),又能跳到 s1(假定它是)。NFA 不必当场抉择,两个分支同时保留,集合里因而常同时含有 s0 与其后的状态。读完只要集合包含 accept state,就说明至少有一条分支成功。

建议 · NFA 与 DFA 的表达能力相同,任何 NFA 都存在接受同一语言的 DFA,subset construction 页正是把上述集合直接变成 DFA 的状态。NFA 的价值在书写:它与 regex 几乎一一对应,所以编译 regex 时先落成 NFA 最自然,见 Thompson construction 页。