词法分析重点:从RE到NFA再到DFA以及最小化DFA

原文链接:https://blog.csdn.net/u014541281/article/details/52423191

整体的步骤是三步: 
一,先把正规式转换为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为终态,所以所有包含9的集合都被认为是终态集,改成1.2.3.。。方便画节点后就需要把这些点作为终态了。。

三.最小化,分割法。

FA的最小化就是寻求最小状态DFA

最小状态DFA的含义: 
1.没有多余状态(死状态)

image

除多余状态 
什么是多余状态? 
从这个状态没有通路到达终态;S1 
从开始状态出发,任何输入串也不能到达的那个状态。S2 
如何消除多余状态? 
删除

2. 没有两个状态是互相等价(不可区别) 
两个状态s和t等价的条件: 
兼容性(一致性)条件——同是终态或同是非终态 
传播性(蔓延性)条件——对于所有输入符号,状态s和状态t必须转换到等价的状态里。。

DFA的最小化—例子,第一步都是固定的。分成终态和非终态

1.将M的状态分为两个子集一个由终态k1={C,D,E,F}组成,一个由非终态k2={S,A,B}组成,

2.考察{S,A,B}是否可分.

因为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如图,: 

 

【最小化DFA】

原文链接:https://blog.csdn.net/qq_33605778/article/details/80105658

预备


最简化的DFA:这个DFA没有多余状态、也没有两个相互等价的状态。一个DFA可以通过消除无用状态、合并等价状态而转换成一个与之等价的最小状态的有穷自动机。
无用状态:从自动机开始状态出发,任何输入串也发到达的那个状态,或者这个状态没有通路可达终态。
等价转态:两个状态,识别相同的串,结果都同为正确或错误,这两个状态就是等价的。
区别状态:不是等价状态。


化简DFA


分割法:把一个DFA(不含多余状态)的状态分割成一些不相交的子集,并且任意两个子集之间的状态都是可区别状态,同一子集内部的状态都是等价状态。
步骤(按分割法)

I0 = 非状态元素构成的集合,I1 = 终态元素构成的集合
经过多次划分后,要保证,任意一个Ik中的元素通过move(Ik,某个字符)的结果都同属于一个Iz,这时候划分完成。否则把状态不同的单独划分出去。
重复上一步,直至没有新的I子集增加。
从子集中任选一个代替整体,画出最简DFA。


例子
题目:将下图DFA M最小化

 

分割成I0,I1


-----------------I0、I1分割-------------------
I0 = {1,2,3,4} ; 非终态
I1 = {5,6,7} ; 终态123


检验I0中元素的等价性,不等价就分割


move(1,a) = 6 ∈I1
move(1,b) = 3 ∈I0

move(2,a) = 7 ∈I1
move(2,b) = 3 ∈I0

move(3,a) = 1 ∈I0
move(3,b) = 5 ∈I1

move(4,a) = 4 ∈I0
move(4,b) = 6 ∈I1

可以发现,{1,2}是等价的,{3,4}是等价的
所以现在分割成了:I2 = {1,2}, I1 = {5,6,7}, I3 = {3,4}1234567891011121314


检测I2中元素的等价性,不等价就分割


move(1,a) = 6 ∈I1
move(1,b) = 3 ∈I3

move(2,a) = 7 ∈I1
move(2,b) = 3 ∈I3

可以发现,是等价的,不用分割1234567


检测I3中元素的等价性,不等价就分割


move(3,a) = 1 ∈I2
move(3,b) = 5 ∈I1

move(4,a) = 4 ∈I3
move(4,b) = 6 ∈I1
可以发现,不是等价的,分割成{3},{4}
所以现在分割成了:I2 = {1,2}, I1 = {5,6,7}, I4 = {3}, I5 = {4}1234567


检测I1中元素的等价性,不等价就分割


move(5,a)  = 7 ∈ I1
move(5,b)  = 3 ∈ I4

move(6,a)  = 4 ∈ I5
move(6,b)  = 1 ∈ I2

move(7,a)  = 4 ∈ I5
move(7,b)  = 2 ∈ I2

可以发现,不是等价的,分割成{6,7}, {5}
所以现在分割成了:I2 = {1,2}, I4 = {3}, I5 = {4}, I6 = {5},I7 = {6,7} 1234567891011


检测后发现,不可再分割,所以最终分割结果就是:I2 = {1,2}, I4 = {3}, I5 = {4}, I6 = {5},I7 = {6,7} 
画转态转换图:从集合中选取一个代表就可以 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值