0
点赞
收藏
分享

微信扫一扫

编译原理_NFA->DFA 子集法


文章目录

  • ​​NFA等价的DFA子集法求解​​
  • ​​NFA​​
  • ​​DFA(NFA的特例)​​
  • ​​正则表达式构造NFA​​
  • ​​求解五元组​​
  • ​​两种运算​​
  • ​​求解子集算法​​
  • ​​例子​​
  • ​​回顾转移函数的定义​​
  • ​​收获五元组​​
  • ​​更多例子​​
  • ​​利用图表整理计算过程​​



NFA等价的DFA子集法求解

NFA

一个不确定的有穷自动机 M 是一个五元组:

编译原理_NFA->DFA 子集法_结点

其中:

(1) 编译原理_NFA->DFA 子集法_元组_02 是一个有穷集, 它的每个元素称为一个状态。
(2) 编译原理_NFA->DFA 子集法_转换函数_03 是一个有穷字母表, 它的每个元素称为一个输人符号。

(3) 编译原理_NFA->DFA 子集法_结点_04 是一个从 编译原理_NFA->DFA 子集法_转换函数_05编译原理_NFA->DFA 子集法_元组_02 的全体子集的映像, 即 编译原理_NFA->DFA 子集法_元组_07 , 其中 编译原理_NFA->DFA 子集法_转换函数_08 表示 编译原理_NFA->DFA 子集法_元组_02 的 幂集。

(4) 编译原理_NFA->DFA 子集法_编译原理_10 , 是一个非空初态集。
(5) 编译原理_NFA->DFA 子集法_转换函数_11 , 是一个终态集。

一个含有m个状态和n 个输人符号的NFA可表示成一张状态转换图,
这张图含有m个状态结点,每个结点可射出若干条箭弧与别的结点相连接,
每条弧用编译原理_NFA->DFA 子集法_元组_12中的一个串作标记,整个图至少含有一个初态结点以及若干个终态结点。

DFA(NFA的特例)

编译原理_NFA->DFA 子集法_元组_13

正则表达式构造NFA

基础对应关系
编译原理_NFA->DFA 子集法_转换函数_14
编译原理_NFA->DFA 子集法_结点_15

求解五元组

欲求NFA N等价的DFA M,需要求出对应的DFA M的五元组

两种运算

  • 编译原理_NFA->DFA 子集法_结点_16编译原理_NFA->DFA 子集法_结点_17运算
    编译原理_NFA->DFA 子集法_元组_18

我们把下文用到的符号捋一下:

  • 编译原理_NFA->DFA 子集法_编译原理_19分别作为NFA的有穷状态集合和初始状态以及终止状态
  • 编译原理_NFA->DFA 子集法_结点_20分别作为DFA的有穷状态集合和初始状态以及终止状态
  • 主要部分是求解M的状态集S(其又有DFA N的状态机K的一些子集组成)
  • 问题有转成求解K的子集
  • 我们使用编译原理_NFA->DFA 子集法_元组_21数组表示待求状态集S中的元素(状态元素)
  • DFA的状态是NFA的状态集的子集

编译原理_NFA->DFA 子集法_元组_22

  • 注意到,这里说编译原理_NFA->DFA 子集法_编译原理_23是有序的,S是一个集合其内部元素是无序的(书写的时候不体现顺序).
  • 转换函数D(S,a)=R(此处a代表输入字符集合编译原理_NFA->DFA 子集法_元组_24中的任意元素);
  • S,R是状态集合(NFA的状态子集);S,R作为DFA的状态

编译原理_NFA->DFA 子集法_结点_25编译原理_NFA->DFA 子集法_转换函数_26

本图中,不确定有穷状态机N的有限状态集K包括了0,1,…10 这11中状态.;

且,其实状态编译原理_NFA->DFA 子集法_元组_27是状态0

子集族C要表达的意思和S相近,C可能强调顺序

求解子集算法

编译原理_NFA->DFA 子集法_转换函数_28

算法为二重循环

  • 内层循环for比较确定
  • 外层循环while的终止依赖于内循环for的计算结果

中的内层循环(for)是对输入符号集合(字母表)做遍历

  • 算法伪代码中的U就是下面所说的子集编译原理_NFA->DFA 子集法_编译原理_29
  • 结合本例题,这个被遍历的输入集合是编译原理_NFA->DFA 子集法_转换函数_30
  • 内部的两个抽象运算也比较简单
  • 编译原理_NFA->DFA 子集法_编译原理_31
  • 运行一次编译原理_NFA->DFA 子集法_结点_32运算,可以得到一个子集族中的元素编译原理_NFA->DFA 子集法_结点_33
  • 准确的说,是下一个子集编译原理_NFA->DFA 子集法_结点_34的候选集合是经过编译原理_NFA->DFA 子集法_结点_35和move的嵌套(复合)运算得到的,当这个候选集合是想对于集合族是全新的集合时,它就成为了编译原理_NFA->DFA 子集法_结点_34
  • 经过一次for循环的遍历,可能产生超过一个的新增子集加入到子集族编译原理_NFA->DFA 子集法_编译原理_37
  • 同一个for循环还没走完之前,使用的都是同一个编译原理_NFA->DFA 子集法_结点_33(它就是while循环开头所作的被新标记的子集T)来计算新的候选子集
  • 编译原理_NFA->DFA 子集法_结点_39
  • 都是找出某一出边(弧)的过程前者是找编译原理_NFA->DFA 子集法_元组_40(可以连续多次的);后者是找输入符号a(不可连续)
  • 手工计算的时候,可以使用树形分叉记法(习惯看表格的话叶可以将状态转移图转化成状态转移表,然后再画树状分支,注意编译原理_NFA->DFA 子集法_转换函数_41运算包含起点本身)

例子

可以围绕这FA的各个状态节点,将出边标出

编译原理_NFA->DFA 子集法_编译原理_42

编译原理_NFA->DFA 子集法_元组_43编译原理_NFA->DFA 子集法_结点_44

回顾转移函数的定义

  • 我们将编译原理_NFA->DFA 子集法_转换函数_45集合分别视为一个个整体作为互不相同的状态(DFA)的状态;并可以进一步简写为1,2,3,4

编译原理_NFA->DFA 子集法_结点_46

  • 该定义还是基于NFA
  • 转换函数编译原理_NFA->DFA 子集法_转换函数_47(此处a代表输入字符集合编译原理_NFA->DFA 子集法_编译原理_48中的任意元素);
  • 最终,确定下来的转换函数D可以有前面计算并确定DFA状态集S(各个子集编译原理_NFA->DFA 子集法_转换函数_49)时得出的结论分别收集记录下来;便可方便的得到DFA的​​​状态转移图​

收获五元组

编译原理_NFA->DFA 子集法_编译原理_50
在计算子集的时候,可以将过程用表格的形式记录,这会方便于整理转换函数的总结

更多例子

编译原理_NFA->DFA 子集法_元组_51
构造下列正则表达式的DFA

  • 编译原理_NFA->DFA 子集法_结点_52
  • 编译原理_NFA->DFA 子集法_编译原理_53
  • 编译原理_NFA->DFA 子集法_编译原理_54
  • 编译原理_NFA->DFA 子集法_元组_55

利用图表整理计算过程

下方例子中出现的符号说名

  • 子集编译原理_NFA->DFA 子集法_编译原理_56相当于前面说的子集族编译原理_NFA->DFA 子集法_转换函数_57,收集各不相同的状态集,其数字别名,作为DFA的状态.
  • 编译原理_NFA->DFA 子集法_结点_58作为算法内部的for循环的遍历结果(候选子集,候选子集也标记上相应的数字标号)
  • 从表中可以方便的得到DFA的转换函数
  • 同一行内的三个数据:例如第3行,可以解读出的转换函数(注意算法中转换函数的定义),
  • D(2,0)=2;
  • D(2,1)=3
    编译原理_NFA->DFA 子集法_转换函数_59
    编译原理_NFA->DFA 子集法_元组_60

上面编译原理_NFA->DFA 子集法_结点_61列的{AF}应该是印刷错误,应该是{A}1

编译原理_NFA->DFA 子集法_元组_62
编译原理_NFA->DFA 子集法_编译原理_63


举报

相关推荐

0 条评论