【编译原理】:NFA转变为DFA的子集构造法
2016-12-24 21:58
232 查看
整体的步骤是三步:
一,先把正规式转换为NFA(非确定有穷自动机),
二,在把NFA通过“子集构造法”转化为DFA,
三,在把DFA通过“分割法”进行最小化。
一步很简单,就是反复运用下图的规则,图1
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/01/2b55b8fca3a696ef82557b03f2bfbe17)
这样就能转换到NFA了。
给出一个例题,来自Google book。本文主要根据这个例题来讲,图2
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/01/b52a56c1af00fb7ebbdbeafc72bb5d15)
二.子集构造法。
同样的例题,把转换好的NFA确定化,图3
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/01/246567745b9ce59ada25cd52d2b557e5)
这个表是从NFA到DFA的时候必须要用到的。第一列第一行I的意思是从NFA的起始节点经过任意个ε所能到达的结点集合。Ia表示从该集合开始经过一个a所能到达的集合,经过一个a的意思是可以略过前后的ε。同样Ib也就是经过一个b,可以略过前后任意个ε。
至于第二行以及后面的I是怎么确定的。我参考了一些题目才明白,原来就是看上面的Ia和Ib哪个还没出现在I列,就拿下来进行运算,该列对应的Ia和Ib就是前面我说的那样推导。
如果还不太明白,看图就是了。你会发现I中的几个项目都在Ia和Ib中出现了。而且是完全出现
这步做完以后,为了画出最后的DFA,那么肯定得标出一些号来,比如1.2.3.。或者A。 B。c,我一般标的方法是先把I列全部标上1.2.3.递增。然后看1表示的集合和Ia和Ib中的哪个集合一样,就把那个集合也表示为1.继续向下做。最后会得到这样一个表格。图4
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/01/2116beec22f8d9a2cfb990efa49783ba)
至此,就可以表示出DFA了。就对照上面那个表,从0节点开始经过a到1.经过b到2,就这样画就行了。。
最后的DFA如下图,图5
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/01/f5589013d4153d181e714fb9cb5e99a2)
双圈的表示终态,这个是怎么来的呢。去看看图4,会发现有些项之前有双圈标志,这个是因为在NFA图2中,9为终态,,改成1.2.3.。。方便画节点后就需要把这些点作为终态了。。
三.最小化,分割法。
FA的最小化就是寻求最小状态DFA
最小状态DFA的含义:
1.没有多余状态(死状态)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/22/ac754ee6f4440dc650f24e033728502b.png)
除多余状态
什么是多余状态?
从这个状态没有通路到达终态;S1
从开始状态出发,任何输入串也不能到达的那个状态。S2
如何消除多余状态?
删除
2. 没有两个状态是互相等价(不可区别)
两个状态s和t等价的条件:
兼容性(一致性)条件——同是终态或同是非终态
传播性(蔓延性)条件——对于所有输入符号,状态s和状态t必须转换到等价的状态里。。
DFA的最小化—例子,第一步都是固定的。分成终态和非终态
1.将M的状态分为两个子集一个由终态k1={C,D,E,F}组成,一个由非终态k2={S,A,B}组成,
2.考察{S,A,B}是否可分.
![](http://leaverimage.b0.upaiyun.com/20927_o.jpg)
因为A经过a到达C属于k1.而S经过a到达A属于k2.B经过a到达A属于k2,所以K2继续划分为{S,B},{A},
3.考察{S,B}是否可再分:
B经过b到达D属于k1.S经过b到达B属于k2,所以S,B可以划分。划分为{S},{B}
4.考察{C,D,E,F}是否可再分:
因为C,D,E,F经过a和b到达的状态都属于{C,D,E,F}=k1所以相同,所以不可再分:
5.{C,D,E,F}以{D}来代替则,因为CDEF相同,你也可以用C来代替。无所谓的最小化的DFA如图,:
![](http://leaverimage.b0.upaiyun.com/20928_o.jpg)
转自:http://blog.csdn.net/qq_23100787/article/details/50402643
一,先把正规式转换为NFA(非确定有穷自动机),
二,在把NFA通过“子集构造法”转化为DFA,
三,在把DFA通过“分割法”进行最小化。
一步很简单,就是反复运用下图的规则,图1
这样就能转换到NFA了。
给出一个例题,来自Google book。本文主要根据这个例题来讲,图2
二.子集构造法。
同样的例题,把转换好的NFA确定化,图3
这个表是从NFA到DFA的时候必须要用到的。第一列第一行I的意思是从NFA的起始节点经过任意个ε所能到达的结点集合。Ia表示从该集合开始经过一个a所能到达的集合,经过一个a的意思是可以略过前后的ε。同样Ib也就是经过一个b,可以略过前后任意个ε。
至于第二行以及后面的I是怎么确定的。我参考了一些题目才明白,原来就是看上面的Ia和Ib哪个还没出现在I列,就拿下来进行运算,该列对应的Ia和Ib就是前面我说的那样推导。
如果还不太明白,看图就是了。你会发现I中的几个项目都在Ia和Ib中出现了。而且是完全出现
这步做完以后,为了画出最后的DFA,那么肯定得标出一些号来,比如1.2.3.。或者A。 B。c,我一般标的方法是先把I列全部标上1.2.3.递增。然后看1表示的集合和Ia和Ib中的哪个集合一样,就把那个集合也表示为1.继续向下做。最后会得到这样一个表格。图4
至此,就可以表示出DFA了。就对照上面那个表,从0节点开始经过a到1.经过b到2,就这样画就行了。。
最后的DFA如下图,图5
双圈的表示终态,这个是怎么来的呢。去看看图4,会发现有些项之前有双圈标志,这个是因为在NFA图2中,9为终态,,改成1.2.3.。。方便画节点后就需要把这些点作为终态了。。
三.最小化,分割法。
FA的最小化就是寻求最小状态DFA
最小状态DFA的含义:
1.没有多余状态(死状态)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/22/ac754ee6f4440dc650f24e033728502b.png)
除多余状态
什么是多余状态?
从这个状态没有通路到达终态;S1
从开始状态出发,任何输入串也不能到达的那个状态。S2
如何消除多余状态?
删除
2. 没有两个状态是互相等价(不可区别)
两个状态s和t等价的条件:
兼容性(一致性)条件——同是终态或同是非终态
传播性(蔓延性)条件——对于所有输入符号,状态s和状态t必须转换到等价的状态里。。
DFA的最小化—例子,第一步都是固定的。分成终态和非终态
1.将M的状态分为两个子集一个由终态k1={C,D,E,F}组成,一个由非终态k2={S,A,B}组成,
2.考察{S,A,B}是否可分.
![](http://leaverimage.b0.upaiyun.com/20927_o.jpg)
因为A经过a到达C属于k1.而S经过a到达A属于k2.B经过a到达A属于k2,所以K2继续划分为{S,B},{A},
3.考察{S,B}是否可再分:
B经过b到达D属于k1.S经过b到达B属于k2,所以S,B可以划分。划分为{S},{B}
4.考察{C,D,E,F}是否可再分:
因为C,D,E,F经过a和b到达的状态都属于{C,D,E,F}=k1所以相同,所以不可再分:
5.{C,D,E,F}以{D}来代替则,因为CDEF相同,你也可以用C来代替。无所谓的最小化的DFA如图,:
![](http://leaverimage.b0.upaiyun.com/20928_o.jpg)
转自:http://blog.csdn.net/qq_23100787/article/details/50402643
相关文章推荐
- 【编译原理】:NFA转变为DFA的子集构造法
- 编译原理实验——将NFA转化为DFA
- 编译原理中的正则表达式、NFA和DFA
- 个人学习笔记——编译原理:NFA DFA
- 编译原理 子集构造法实现
- 利用子集构造法实现NFA到DFA的转换
- <编译原理>NFA转化DFA 及 DFA的化简
- 编译原理 —— 正则->NFA->DFA->MFA (Web)
- 编译原理中的正则表达式、NFA和DFA
- [编译原理代码][NFA转DFA并最小化DFA并使用DFA进行词法分析]
- 编译原理:有穷自动机(DFA与NFA)
- 编译原理与编译构造 由NFA变为DFA
- 编译原理:NFA转DFA
- 编译原理学习周入门教程--(9)编译程序第一个工作阶段-词法分析(NFA和DFA转换) .
- 编译原理 NFA_DFA代码实现 bfs+dfs+状态压缩 伪代码
- 编译原理(二) NFA的确定化及DFA的最小化的算法及C++实现
- 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——3 计算4个函数
- 编译原理之DFA自动机的
- 编译原理 实验2 DFA的运行
- 编译原理中的正规表达式转NFA