DFA minimization:合并行为一样的 state
subset construction 造出的 DFA 常有冗余:两个 state 若对任何后续输入,接受 / 拒绝的结局都完全一致,它们就是等价的,留一个就够。把所有等价的 state 各自合成一个,得到的最小 DFA 是唯一的(同构意义下)——这是有限自动机里少见的「标准答案」。
怎么找出等价的 state?用划分细化 (partition refinement),从粗到细:
- 先分两大组:accept 与 非 accept——一个接受空串后续、一个不接受,显然不可能等价。
- 反复细分:看同一组里的两个 state,若存在某个字符 c,使它们读 c 后跳进了不同的组,那它们行为有别,拆开。
- 直到没有任何组还能再拆:此时每组内部行为完全一致,每组捏成一个 state。
下面给每个组一种颜色,单步看分组怎样越分越细、最后稳定下来。
1 · 合并结果:最小 DFA
每个颜色组捏成一个 state(标号 ),转移用组内任一代表 state 的转移即可——同组保证一致。
为什么细化一定停、且结果唯一?每一轮组数只增不减,而组数被 state 数封顶,所以必然停。停下时的划分恰好是「Myhill–Nerode 等价类」,与你从哪一步、按什么顺序拆无关——所以最小 DFA 唯一。这条性质让 DFA 能被规范化: 两个 regex 是否等价,把各自的最小 DFA 比一比同构就知道了。