关于编译原理最小化的操作,专业术语请移步至: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. ionic3 生命周期 之 ionViewWillLeave 坑

    ionic3  生命周期 ionViewWillLeave,当页面关闭离开时 执行的事件, 从页面根部跳转 this.appCtrl.getRootNav().setRoot() 方法离开时是 不执行 ...

  2. adobe air for ios 例子

    越南soha 平台ios ane http://yun.baidu.com/s/1o65G9XS 里面有oc源码,as库,以及打包生成ane,测试ane 全过程

  3. 移除Excel工作表密码保护小工具含C#源代码

    有朋友发了个Excel.xlsx文件给我,让我帮忙看看里面是怎么做出来的.打开审阅后发现,每个Excel工作表都添加了密码保护: 看不到里面的隐藏列和公式等等,感觉很神秘.于是研究了一下Excel文件 ...

  4. [TJOI2009]猜数字

    题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...

  5. c# ASP.NET Core2.2利用中间件支持跨域请求

    1.public void Configure(IApplicationBuilder app, IHostingEnvironment env)方法里面 不要加上:app.UseCors(); 2. ...

  6. linux配制DNS服务器基本能功能

    1.环境 Centos 6.5 bind 关闭防火墙和SELINUX 2.安装bind服务软件 yum -y install bind 3.配制主配制文件/etc/name.conf options ...

  7. SV-assertion

    断言(assert)是一种描述性语言,通过描述的期望结果来进行仿真验证. 断言有一个更加基础的信息,我们称为属性(property),属性可以作为断言结果,功能覆盖点,形式检查和约束随机激励生成. 断 ...

  8. Python之socket_udp

    UDP服务端&客户端编程 ''' udp编程 创建socket对象,socket.SOCK_DGRAM 绑定ip和port,bind()方法 传输数据 1.接收数据,socket.recvfr ...

  9. mondodb和mysql的区别

    我想从安全性和数据量这两个方面进行阐述. mongodb与mysql命令对比 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成, MongoDB ...

  10. angularjs简单介绍和特点

    首先angular是一个mvc框架, 使用mvc解耦, 采用model, controller以及view的方式去组织代码, 会将一个html页面分成若干个模块, 每个模块都有自己的scope, se ...