关于编译原理最小化的操作,专业术语请移步至: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. JAVA项目中文件重命名方式

    可以直接改类名,之后eclipse会报错: 点击×号会给出解决方案: 注意:不能通过右击servlet文件直接重命名.否则运行之后程序会报错(文件路径不对之类的)

  2. Spark SQL 编程初级实践

    一.实验目的 (1)       通过实验掌握 Spark SQL 的基本编程方法: (2)       熟悉 RDD 到 DataFrame 的转化方法: (3)       熟悉利用 Spark ...

  3. Redis.之.环境搭建(集群)

    Redis.之.环境搭建(集群) 现有环境: /u01/app/ |- redis # 单机版 |- redis-3.2.12    # redis源件 所需软件:redis-3.0.0.gem -- ...

  4. iOS深浅拷贝

    浅拷贝:你和你的影子,你改变,你的影子发生改变 深拷贝:你的克隆人,你改变,你的克隆人并不会发生变化 eg: NSString *string = @"我是一个小白鼠"; NSSt ...

  5. JavaScript学习day01

    一,改变 HTML 内容 (1)方法一: document.getElementById("demo").innerHTML= "My First JavaScriptF ...

  6. com.mysql.cj.core.exceptions.InvalidConnectionAttributeException: The server time zone value '��� mysql-installer-community-8.0.15.0

    <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &l ...

  7. html5 css练习 画廊 元素旋转

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  8. zw字王《中华大字库》2018版升级项目正式启动

    zw字王<中华大字库>2018版升级项目正式启动 https://www.cnblogs.com/ziwang/p/9500537.html 这次升级是和字库协会一起合作,首批推出的字体, ...

  9. AndroidStudio 快捷键(最实用的20个)(转)

    有时候用的编辑器多了,快捷键容易记混淆,所以我门只用记最实用的快捷键就行了,其他效率不高的到要用的时候再查也不迟 下面是我使用AndroidStudio以来最常用的也是我认为最有用的20个快捷键 给大 ...

  10. 2018-2019-2 网络对抗技术 20165335 Exp4 恶意代码分析

    实验内容: 一.使用schtacks进行系统运行监控,使用sysmon工具监控系统的具体进程,使用各种工具进行监控,并针对软件的启动回连,安装到目标机,以及其他的控制行为的分析,同时,对主机的注册表, ...