编译原理(二)NFA转DFA,DFA的化简

DFA与NFA的区别在于:DFA的每一次输入只对应一个结果,而NFA的依次输入可能对应多个结果,形成一个结果集,可以使用子集法将NFA构造为DFA,大白话就是,DFA的一条边,上面一个条件吧,它只能有一个这条边,而NFA的话,它是可以有多个,指向不同的节点,(当然不同条件的边谁都有),这也正是为什么它的表的元素是一个集合。

一般凭直观构造出的自动机都是NFA,而要把NFA转换成DFA,要用子集构造法。构建DFA的目的是消除歧义性,毕竟可以有多个走法,那么走谁呢?是吧。一般是正则表达式->NFA->DFA->DFA化简。

定义真的是蛮变态的,还是自己总结的清楚简单直接明白。下面介绍子集构造法NFA转DFA。就是找闭包而已。

这里的意思就是从0开始,找0的闭包是为A,闭包在1中已经说过了,然后看输入符号a后的那一个闭包就是B,然后一直往下写就是了(允许重复着),这个填出来的表就是DFA表:

然后就按照表画DFA自动机就可以了。有限自动机也是有双圈。

这么简单的事情愣是说的那么复杂。。。

紧接着就是DFA的化简,化简一样是说的超级啰嗦。

一个通路只能走向一个类,例如b走向G2,G1的话,那么就需要进行拆分,把B拆出来。

原理是什么呢?如果说,多个节点,它们的指向的都是同样的话,那么它们是不是可以归为一个节点?如果仅仅是一个节点了,那么它走谁都无所谓了。除了在本区块内互窜外,出去是应该是一致的。

 

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值