编译原理中DFA最小化
- 格式:pdf
- 大小:79.36 KB
- 文档页数:2
编译原理中DFA最⼩化
这⾥只是记录⼀下个⼈的理解,以备复习使⽤
DFA最⼩化的操作步骤:
1.将DFA未最⼩化前的状态划分为:终态和⾮终态
终态就是包含了NFA终点结点的状态集合,如下图的NFA,状态10为NFA的终点,所以在DFA的状态集合中,包含了10这个状态的集合就是DFA的终态,那么,不包含的就是⾮终态
了
值得⼀提的是,在DFA划分⾮终态和终态时,有可能得到的⾮终态是空集(仔细想想,此时
意味着所有的DFA的状态集合都包含了NFA的终点(如下图的10)),反之,终态不可能为
空集,因为NFA的终点⼀定会包含在某个DFA的状态集合中。
得到的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所有的
状态。
当然,这只是初步的想法,不知道可不可以,我觉上述想法的难点可能在,当状态划分越来
越多的时候,判断两个状态是否属于同⼀个状态的⼯作可能会越来越⿇烦?