NFA转成DFA(子集法)

为什么要将NFA转成DFA呢?

因为NFA是不确定的有限自动机,状态A接收0可能转到状态B/C/D……,转出是不确定的;DFA是确定有限自动机,状态A接收0只能转到一个确定的状态。

一般使用子集法将NFA转成DFA,例子如下:

这是一个NFA,含有空字符串\varepsilon\varepsilon连接的两个状态是等价的,可以视为一个状态,比如{X,5,1},这个状态接收a转到5状态({X,5,1}中的5)和3状态({X,5,1}中的1),接收b转到5状态({X,5,1}中的5)和4状态({X,5,1}中的1),这就是不确定性,是NFA的特点,DFA中是不允许有空字符串\varepsilon的,有空字符串\varepsilon的一定是NFA。

使用子集法将NFA转成DFA:
构建状态转移矩阵:

I是状态,Ia是状态I接收a之后的状态,Ib是状态I接收b之后的状态。

初始状态是{X,5,1},这三个是一个状态,接收a之后,得到{5,3},然后5和1是等价的,得到{5,3,1},为什么不加X呢,X和5、1都是等价的,因为从前往后看就行了,等价不需要回头看X,往后找到1就行了。{X,5,1}接收a得到{5,4,1}。然后将{5,3,1}和{5,4,1}拉下来,成为第二行和第三行的初始状态,然后再接收a,b,重复进行,每当第二列和第三列出现第一列没有的状态,就将这个状态加入第一列,直到表中所有的状态都在第一列中出现。特殊情况是:假如{5,6,7}接收a是空集{},就是567三个状态都不接收a,结果是空集,空集算不算一个新的状态呢,需不需要拉下来呢?其实拉下来或者不拉下来都不会影响最后的自动机,建议不用拉到第一列,省事。

然后用新的状态:0123456来代替第一列,然后将上图转成下面的图形:
 

IIaIb
012
132
215
334
465
565
634

然后就可以画出DFA了:
 

这时候的DFA并不是最简洁的版本,DFA中有些状态是等价的,可以合成一个,具体的化简方式在另一篇文章中给出:

DFA化简_多多喝水tj的博客-CSDN博客

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值