编译原理:怎样求最小状态的DFA

本文转自Wendell Yi 的文章 谢谢他的分享 原地址:http://www.cnblogs.com/wendellyi/p/3695489.html

原始DFA如下图所示

最小化的定义:
1.没有多余的状态(死状态);
2.没有两个状态是相互等价的;

两个状态等价的含义:
1.兼容性(一致性)——同是终态或同是非终态;
2.传播性(蔓延性)——从s出发读入某个a和从t出发经过某个a并且经过某个b到达的状态等价。

令M为DFA中所有状态的集合。
1.开始做粗略划分,将状态集M的状态划分为,
k1 = {C, D, E, F}
k2 = {S, A, B}
2.考察k1是否可分,由下面的转换关系k2可以分为{S, B}和{A}。
A -> a -> k1
S -> a -> k2
B -> a -> k2

3.对于{S, B}有下面的转换关系,可以划分为{S}和{B}
B -> b -> k1
S -> b -> k2

4.考察k1,对于经由a和b,到达的状态都是属于k1,所以不可再分。

对于是否可以再分,有一个形式化的定义,
  任意的c属于字符集合Σ,si经由c到达sx,以及sj经由c到达sy,那么sx和sy均属于的状态集合pt。如果有任何状态sk属于pt,dk经由c到达dz,dz不属于pt,那么dk不能再继续留在pt中。

5.状态集k1采用状态C来替代,当然可以使用k1中其他状态来替代,得到如下的最小DFA,

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值