Transformation of RE, NFA, DFA
Outline:
- REGEX -> NFA
- NFA -> DFA
- Minimizing DFA
- DFA -> REGEX
- Prove DFA <=> REGEX
RE -> NFA
使用Thompson 构造法, 基本思想是 按结构归纳
- 对正则定义的每个规则,分别建立一个图的映射,因此所有正则表达式都可以表现为这些子图的组合
NFA -> DFA
用子集构造法
1 | Subset-Construction(NFA) |
简言之,根据连通性不断添加新状态,直到所有状态成为闭包
Minimizing DFA
1 | Min-DFA(Dtran) |
- 首先将上面的 DFA 分为非终止状态和终止状态两组,然后对每一组进行检查是否能够再做划分,若可则对划分后的组再划分,直到不可再划分
- 最后根据划分后的组重建 Dtran 表并重绘 DFA 图
不可划分
:若对于组内所有状态,对于所有输入都有相同的输出状态,则称该组
不可再被划分
。
Prove DFA <=> RE
验证DFA和其转化出的REGEX的等价性, 使用Kleene闭包
符号归约:
假设有向图中节点编号为
(初始状态)到 : 从节点 i 到节点 j、且中间节点编号不大于k的所有路径 : 从节点 i 到节点 j、且不经过中间节点的所有路径 : 路径不可达, 我们有 r = r = 和 |r = r : 空路径,即状态不发生变化的边(回到同一状态)
Kleene闭包: $R_{ij}^{k} = R_{ij}^{k-1} (R_{ij}{k})* R_{ij}^{k-1} | R_{ij}^{k-1} $ ( 就是Floyd算法 )
步骤:
- 动态规划思想,从
开始不断迭代,直到有 ,其中 和 是起点和终点 - 验证结果是否与原来的正则等价
- 动态规划思想,从