关于编译原理最小化的操作,专业术语请移步至:http://www.360doc.com/content/18/0601/21/11962419_758841916.shtml

这里只是记录一下个人的理解,以备复习使用

DFA最小化的操作步骤:

1.将DFA未最小化前的状态划分为:终态和非终态

终态就是包含了NFA终点结点的状态集合,如下图的NFA,状态10为NFA的终点,所以在DFA的状态集合中,包含了10这个状态的集合就是DFA的终态,那么,不包含的就是非终态了

值得一提的是,在DFA划分非终态和终态时,有可能得到的非终态是空集(仔细想想,此时意味着所有的DFA的状态集合都包含了NFA的终点(如下图的10)),反之,终态不可能为空集,因为NFA的终点一定会包含在某个DFA的状态集合中。

子集构造的过程如下:(关于子集构造的描述也可以移步至:http://www.360doc.com/content/18/0601/21/11962419_758841916.shtml

得到的DFA图如下:(双重圈表示终态,单层表示非终态,对照上面所说的,是不是包含了10的都是被归类为终态集合?)

但是,上面划分的终态和非终态只是一个初步的划分,可能在终态(或者非终态)集合内还可以继续划分出多个状态集合

首先看定义:
在DFA中,两个状态等价的条件是:
一致性条件:状态s和t必须同时为终态或者非终态 (什么意思?就是意味着终态和非终态里的状态集合不可能再被划分为相同的状态了,所以第一步划分终态和非终态可以理解为粗略的划分)
蔓延性条件:对于所有输入符号,状态s和状态t必须转换到等价的状态里 。(这该怎么理解呢?请看第二个表)

比如我想知道第二个表中的状态集合[2,3,4,5,7,10]和状态集合[6,9,4,7,10,5] (也即是第二第三行的初始状态集合)是不是属于同一个状态,这个蔓延性条件就是说[2,3,4,5,7,10]经过letter和digit转换得到的[6,9,4,7,10,5] 和 [8,9,4,7,5,10] 与 [6,9,4,7,10,5]经过letter和digit转换得到的[6,9,4,7,10,5] 和 [8,9,4,7,5,10]  是不是同属于同一个状态。(此时可以看出它们都属于终态)。

emmm,感觉我自己表述不清,自己多看书和上面给出的那个连接,应该不难理解的。

接下来说一下我自己划分状态集合的操作。

首先划分成终态和非终态,然后继续在终态和非终态的内部看每个状态之间是否属于同一个状态………………

还是以此图为例:

在图中可以看出终态集合为list = [ [2,3,4,5,7,10],[4,5,6,7,9,10],[4,5,7,8,9,10]] 一共三个集合,要继续看这三个集合是否可以进一步细划

我的想法是递归操作,首先将上面的状态集合的第一个子集取出来,并找出其相应的状态(放入一个state1的List中),接着遍历其他的子集,看是否和state1中的集合的状态相同,是的话就放进state1这个List中,不是的话就放进state2这个状态集合中。最后遍历结束的结果是将[ [2,3,4,5,7,10],[4,5,6,7,9,10],[4,5,7,8,9,10]]这个集合划分成两类,第一类state1是与第一个集合list[0] 状态相同的 ,第二类state2是与第一个集合list[0] 状态相不同的。

接下来,可以判断state2是不是空,如果是空的话,就意味着list中的所有子集的状态都是相同的,即state1,如果state2长度为1,也不用继续判断了,直接将list划分为state1和state2两类了。

如果,state2的长度大于1,那么就得继续对state2进行划分,操作步骤和上面划分list的一致,因此可以使用递归操作。

对于非终态,如果需要划分,操作和上面的一样,最后递归划分结束后,得到的是dfa所有的状态。

当然,这只是初步的想法,不知道可不可以,我觉上述想法的难点可能在,当状态划分越来越多的时候,判断两个状态是否属于同一个状态的工作可能会越来越麻烦?

编译原理中DFA最小化的更多相关文章

  1. 编译原理之DFA最小化,语法分析初步

    1.将DFA最小化: 状态转换图: 识别语言:b*ac*(da)*bb* 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 (1)正规式: S -> 0(1S+ ...

  2. 编译原理:DFA最小化,语法分析初步

    1.将DFA最小化:教材P65 第9题   解析: 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 解析: S→ 0A|1B →S → 0(1S|1)|1(0S|0 ...

  3. DFA 最小化

    NDFA.εNDFA 确定化的细节这里就不总结了,这里说一说DFA最小化的算法. 关于DFA最小化,

  4. dfa最小化,修正了上个版本的一些错误。

    上个版本测试的时候,只用了两个非常简单的测试用例,所以好多情况有问题却没有测试出来 bug1:在生成diff_matrix的时候,循环变量少循环了一次,导致最后一个节点在如果无法与其他点合并的情况下, ...

  5. 第九次作业——DFA最小化,语法分析初步

    老师:MissDu 提交作业 1.将DFA最小化:教材P65 第9题 答: 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 3.自上而下语法分析,回溯产生的原因是 ...

  6. DFA最小化,语法分析初步

    1.将DFA最小化:教材P65 第9题 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 语言:(01 | 10)*(01 | 10) 自动机图: DFA状态转换矩阵 ...

  7. 第九次作业 DFA最小化,语法分析初步

    1.将DFA最小化:教材P65 第9题 Ⅰ {1,2,3,4,5} {6,7} {1,2}b={1,2,3,4,5} 3,4}b={5} {6,7} Ⅱ {1,2}{3,4}{5} {6,7} 2.构 ...

  8. 作业九——DFA最小化

    1.将DFA最小化:教材P65 第9题 I {1, 2, 3, 4, 5} {6, 7} {1, 2}b->{1, 2, 3, 4, 5} {3, 4}b->{6, 7} {5}b-> ...

  9. 第九次-DFA最小化,语法分析初步

    1.将DFA最小化:教材P65 第9题 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 3.自上而下语法分析,回溯产生的原因是什么? 4.P100 练习4,反复提取 ...

随机推荐

  1. NABCD分析---校园服务

    N(需求): 大学生活中,很多琐碎的小事浪费同学时间精力.我们的APP本着为同学服务的宗旨,解决生活中各方面的问题,同学们可以在APP上发布各种信息,例如兼职,二手买卖等等. A(做法): 用户打开A ...

  2. DHCP和TFTP服务

    DHCP服务 主要用途:用于内部网络和网络服务供应商自动分配IP地址给用户 用于内部网络管理员作为对所有电脑作集中管理的手段 使用场景:自动化安装系统 解决IPV4资源不足问题 DHCP共有八种报文: ...

  3. PHP----------支付宝支付的一些注意事项。该博客只适用于20180209之后,的app支付宝支付。

    1.签名方式: 2.设置应用公钥.也就是开发者公钥.

  4. windows CMD常用命令

    命令简介 cmd是command的缩写.即命令行 . 虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在使用,所以一 ...

  5. linux-git

  6. Python之io概念

    """ 同步,异步: 强调结果,调用者最终是否得到想要的结构 阻塞非阻塞: 强调时间是否等待 io二个阶段 1.数据准备阶段 2.内核空间复制回用户空间缓冲区阶段 发生i ...

  7. 【JavaScript】数组

    [声明一个数组]var a=[1,1,1]; [定义数组的长度]var a=new Array(2); [特殊数组]arguments[0][可以不用声明,当数组内没有东西时可以直接通过方法的参数自动 ...

  8. Appium(一)---环境搭建的一些问题

    最近开始学习Appium,一款很不错的自动化测试工具,网上已经有大量的环境搭建教程,我就不再细说,我搭建环境时主要参考如下两个博客https://www.cnblogs.com/yoyoketang/ ...

  9. java正则表达式学习笔记

    Java 正则表达式语法 为了更有效的使用正则表达式,需要了解正则表达式语法.正则表达式语法很复杂,可以写出非常高级的表达式.只有通过大量的练习才能掌握这些语法规则. 本篇文字,我们将通过例子了解正则 ...

  10. docker组件介绍

    一.Docker Client and Daemon(docker egine docker 引擎) docker是一个客户端工具,作用是发送 用户的请求给 dockerd 安装路径: /usr/bi ...