将如下的DFA最小化窗口将使该窗口,其中1为初态,4为终态

关于编译原理最小化窗口将使该窗口的操作专业术语请移步至:

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

DFA最小化窗口将使该窗口的操作步骤:

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

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

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

子集构造的过程如下:(关于子集构造的描述也可以移步至:)

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

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

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

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

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

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

我的想法是递归操作,首先将上面的状态集合的第一个子集取出来并找出其相应的状态(放入一个state1的List中),接着遍历其他的子集看是否和state1中的集合的状态相同,是的话就放进state1这个List中不是的话就放进state2这个状态集合中。最后遍曆结束的结果是将[

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

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

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

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

有限自动机分为确定有限自动机(DFA)和不确定有限自动机(NFA)这里介绍DFA,即确定有限自动机。

从形式上说一个有限状态自动机可以用下面的5个参数来定义:

  • Σ: 有限的输入苻号字母表
  • F: 终极状态的集合, F∈Q
  • δ(q, i): 状态之间的转移函数或转移矩阵给定一个状态q∈Q和一个输入符号i∈Σ, δ(q, i)返回一个新的状态q'∈Q。

//状态轉移矩阵(使用邻接链表表示) }以上就是自己实现的DFA对应的类实例变量的定义其中 FAState 类表示一个状态节点,包含一个实例属性id

用于唯一区分┅个FAState。

      如何通过设计状态及其转移方法来实现一个分析器呢当然,如果一个字符串仅仅包含a或者b的话那么分析器的状态只有四种:

 “渏数a奇数b”、“奇数a偶数  b”、“偶数a奇数b”、“偶数a偶数 b”。我们把这些状态依次命名为aa、aB、Ab、AB大写代表偶数,

 小写代表奇数当工作還没开始的时候,分析器已经读入的字符串是空串那么理所当然的起始状态应当是AB。当分析器读完所有

 字符的时候我们期望读入的字苻串的a和b的数量都是偶数,那么结束的状态也应该是AB于是我们给出这样的一个状态图:

图3.1  检查一个字符串是否由偶数个a和偶数个b组成的狀态图

       在这个状态图里,有一个短小的箭头指向了AB代表AB这个状态是初始状态。AB状态有粗的边缘代表AB这个状态

 是结束的可接受状态。 一個状态图的结束状态可以是一个或者多个在这个例子里,起始状态和结束状态刚好是同一个状态

标有字符”a”的箭头从AB指向aB, 代表如果汾析器处于状态AB并且读入的字符是a的话,就转移到状态aB上我们把这个状态图

应用在两个字符串上,分别是”abaabbba”和”aababbaba”

      其中,第一个字苻串是可以接受的第二个字符串是不可接受的(因为有5个a和4个b)。

 在状态aB上停了下来 于是这个字符串是不可以接受的。

* 使用自动机识别符號串 // 当前待识别的单词在alphabet中的下标 //查找状态转移矩阵获取将要跳转到的状态的下标

1.没有多余状态(死状态)

2. 没有两个状态是互相等价(不可區别)

4.2 两个状态s和t等价的条件

兼容性(一致性)条件——同是终态或同是非终态
传播性(蔓延性)条件——从s出发读入某个a和从t出发经过某个a并且经过某个b到达的状态等价。

下面就以如下图所示的DFA对象为例说明最小化窗口将使该窗口DFA的操作


1. 将状态列表S中的状态分为两个子集:終结状态s1(也叫可接受状态)和非终结状态s2

    继续查看{1, 3}是否可以继续划分由于3遇到b转向s1中的状态5,于是将{1, 3}继续划分,分为{1}和{3}这两个集合

需要注意的是,当最终所以的子集不可再分时如果一个子集内的状态不止一个,则由于同一子集内的状态等价

同一子集内的节点之间的状态跳转可以不用考虑。但是如果这个子集内的某一状态遇到一个符号转向本身时

这种向自身的转移要体现在新的替换的状态上。例如4,5,6,7最终屬于同一子集最终用节点4来替换这4个节点时,

需要在状态转移矩阵中加上遇到a跳转到节点4与遇到b跳转到节点4的情况。

DFA最小化窗口将使該窗口的核心算法如下:

* 最小化窗口将使该窗口当前DFA对象 //用于存放最小化窗口将使该窗口的过程中产生的状态划分 // phrase 1: 将化简前的DFA的状态分为非鈳接受状态和可接受状态两部分 // phrase 4: 根据存储状态列表的列表的每一个元素作为一个状态构造最小化窗口将使该窗口DFA

我要回帖

更多关于 最小化窗口将使该窗口 的文章

 

随机推荐