文章目录
- NFA等价的DFA子集法求解
- NFA
- DFA(NFA的特例)
- 正则表达式构造NFA
- 求解五元组
- 两种运算
- 求解子集算法
- 例子
- 回顾转移函数的定义
- 收获五元组
- 更多例子
- 利用图表整理计算过程
NFA等价的DFA子集法求解
NFA
一个不确定的有穷自动机 M 是一个五元组:
其中:
(1) 是一个有穷集, 它的每个元素称为一个状态。
(2) 是一个有穷字母表, 它的每个元素称为一个输人符号。
(3) 是一个从
到
的全体子集的映像, 即
, 其中
表示
的 幂集。
(4) , 是一个非空初态集。
(5) , 是一个终态集。
一个含有m个状态和n 个输人符号的NFA可表示成一张状态转换图,
这张图含有m个状态结点,每个结点可射出若干条箭弧与别的结点相连接,
每条弧用中的一个串作标记,整个图至少含有一个初态结点以及若干个终态结点。
DFA(NFA的特例)
正则表达式构造NFA
基础对应关系
求解五元组
欲求NFA N等价的DFA M,需要求出对应的DFA M的五元组
两种运算
和
运算
我们把下文用到的符号捋一下:
分别作为NFA的有穷状态集合和初始状态以及终止状态
分别作为DFA的有穷状态集合和初始状态以及终止状态
- 主要部分是求解M的状态集S(其又有DFA N的状态机K的一些子集组成)
- 问题有转成求解K的子集
- 我们使用
数组表示待求状态集S中的元素(状态元素)
- DFA的状态是NFA的状态集的子集
- 注意到,这里说
是有序的,S是一个集合其内部元素是无序的(书写的时候不体现顺序).
- 转换函数D(S,a)=R(此处a代表输入字符集合
中的任意元素);
- S,R是状态集合(NFA的状态子集);S,R作为DFA的状态
本图中,不确定有穷状态机N的有限状态集K包括了0,1,…10 这11中状态.;
且,其实状态是状态0
子集族C要表达的意思和S相近,C可能强调顺序
求解子集算法
算法为二重循环
- 内层循环for比较确定
- 外层循环while的终止依赖于内循环for的计算结果
中的内层循环(for)是对输入符号集合(字母表)做遍历
- 算法伪代码中的U就是下面所说的子集
- 结合本例题,这个被遍历的输入集合是
- 内部的两个抽象运算也比较简单
- 运行一次
运算,可以得到一个子集族中的元素
- 准确的说,是下一个子集
的候选集合是经过
和move的嵌套(复合)运算得到的,当这个候选集合是想对于集合族是全新的集合时,它就成为了
- 经过一次for循环的遍历,可能产生超过一个的新增子集加入到子集族
- 同一个for循环还没走完之前,使用的都是同一个
(它就是while循环开头所作的被新标记的子集T)来计算新的候选子集
- 都是找出某一出边(弧)的过程前者是找
(可以连续多次的);后者是找输入符号a(不可连续)
- 手工计算的时候,可以使用树形分叉记法(习惯看表格的话叶可以将状态转移图转化成状态转移表,然后再画树状分支,注意
运算包含起点本身)
例子
可以围绕这FA的各个状态节点,将出边标出
回顾转移函数的定义
- 我们将
集合分别视为一个个整体作为互不相同的状态(DFA)的状态;并可以进一步简写为1,2,3,4
- 该定义还是基于NFA
- 转换函数
(此处a代表输入字符集合
中的任意元素);
- 最终,确定下来的转换函数D可以有前面计算并确定DFA状态集S(各个子集
)时得出的结论分别收集记录下来;便可方便的得到DFA的
状态转移图
收获五元组
在计算子集的时候,可以将过程用表格的形式记录,这会方便于整理转换函数的总结
更多例子
构造下列正则表达式的DFA
利用图表整理计算过程
下方例子中出现的符号说名
- 子集
相当于前面说的子集族
,收集各不相同的状态集,其数字别名,作为DFA的状态.
作为算法内部的for循环的遍历结果(候选子集,候选子集也标记上相应的数字标号)
- 从表中可以方便的得到DFA的转换函数
- 同一行内的三个数据:例如第3行,可以解读出的转换函数(注意算法中转换函数的定义),
- D(2,0)=2;
- D(2,1)=3
上面列的{AF}应该是印刷错误,应该是{A}1