如果人工进行分析(不考虑编码实现), 不难看出, 如果从 NFA 的起点出发, 存在如下状态转换:
图片
换言之, 1,2,3 这三个节点都是 NFA 首个状态, 于是, 得到如下 NFA :
下一步...从表达的语义来看,DFA 与 NFA 并没有差别,如上例的 NFA 的转换:
其对应的 DFA 转换:
事实上, 两者都表达了 "起点处输入a可能到达1或2"....但是在表达形式上, NFA 将这种二义性(或者说多种可能性)表现在转换上了; 而与之不同, DFA 将二义性表达在状态里, 多种可能性被聚合在状态里, 消除了转换的二义性....前文中讲 NFA 转 DFA 时, 其实忽略一个现实: "转换可以是针对一个范围的输入" ....针对这种情况, 在将 NFA 转换 DFA 时, 需要设计一个算法, 消除 NFA 的存在交集的转换的二义性, 算法过程如下:
上例中, 起点处存在如下 4 个转换:
我们把每个转换的输入区间看作一个集合