编译原理学习笔记(十五)~最小化DFA

举报
海轰Pro 发表于 2021/08/05 23:58:07 2021/08/05
【摘要】 概念         最小化:优化DFA,使其状态数最少。         那么什么时候状态数是最少的呢?这里我们需要介绍两个新的名词:可区分和不可区分。 官方定义:    &...

概念

        最小化:优化DFA,使其状态数最少。

        那么什么时候状态数是最少的呢?这里我们需要介绍两个新的名词:可区分不可区分

官方定义
        可区分:对于任何两个状态t和s,若从一状态出发接受输入字符串ω,而从另一状态出发不接受ω,或者从t出发和从s出发到达不同的接受状态,则称ω对状态t和s是可区分的。
        不可区分:设想任何输入序列ω对s和t均是不可区分的,则说明从s出发和从t出发,分析任何输入序列ω均得到相同结果。因此,s和t可以合并成一个状态
        通俗一点的来说,可区分状态可以理解为两个(或多个)状态根本不是一类,根据下一个输入的符号,不同状态得到的结果可能会出现不同。而不可区分状态就是,这两个(或多个)状态,无论下一个接收的符号是什么,得到的结果都是一样的。【定义理解不懂的,可以参考后面的例子思考,应该会容易一点点】
        综上所述,DFA的最小化就是找出DFA中所有的不可区分状态,把它们合并为一个状态,这样可以简化DFA的状态数,显得更加简洁。

举例说明

下图是一个没有最小化的DFA
在这里插入图片描述
现在我们对其进行最小化,那么怎么办呢?这里一般不好一步到位,需要我们慢慢测试【多试试就可以了】。
在这里插入图片描述
首先从上面的方法可以看出,我们先加上ABC为一类,D是一类。然后测试ABC是可区分还是不可区分的。

  • ABC接收a,到达的状态都是B
  • ABC接收b,到达的状态是C、D。其中AC接收b到达C,B接收b到达D。

从上的分析可以看出,ABC不是同一类的,属于可区分,因为在接收b的时候,出现了分歧。
然后再加上AC是一类,B单独一类,D单独一类。

  • AC接收a,到达的状态都是B
  • AC接收b,到达的状态都是C

从上面的分析我们可以发现,AC是一类,不可区分,因为无论输入a,还是b,它们最终到达的状态都是一样的,所以我们可以说它们是不可区分的。在最小化DFA中,AC是可以合并为一个状态的。
所以最后的最小化DFA就是:
在这里插入图片描述
注:解题没有固定的格式,需要凭借自己的理解去猜测,测试到底哪一组是不可区分。慢慢练习,自然就会熟悉的。

文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。

原文链接:haihong.blog.csdn.net/article/details/106576746

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。