确定与不确定有限自动机DFA与NFA及子集法互相转换


编译原理正规式NFA与DFA及子集法

1.基础术语与概念:

语法描述基本概念
  • 字母表:一个有穷字符集记为Σ

  • 字母表中每个元素称为字符

  • Σ上的字(字符串)是指Σ中的字符所构成的一个有穷序列

  • 不包含任何字符的序列称为空字,记作ε

  • 用Σ*表示Σ上的所有字的全体,包含空字ε

  • 例如:设Σ={a,b},则Σ*={ε, a, b, aa, ab, ba, bb, aaa, …},即Σ的闭包

  • Σ*的子集U和V的连接(积)定义为
    U V = { α β }    α ∈ U , β ∈ V UV=\left\{ \alpha \beta \right\}\; \alpha \in U,\beta \in V UV={αβ}αU,βV

  • V自身的n次积记为
    V n = V    V    . . .    V V^{n}=V\; V\; ...\; V Vn=VV...V

  • V自身的0次积记为
    V 0 = { ϵ } V^{0}=\left\{ \epsilon \right\} V0={ϵ}

  • V*是V的闭包:
    V ∗ = V 0 ∪ V 1 ∪ V 2 ∪ V 3 ∪ . . . V^*=V^{0}\cup V^{1}\cup V^{2}\cup V^{3}\cup ... V=V0V1V2V3...

  • V^+是V的正规闭包(剔除了闭包的空串ε):
    V + = V V ∗ = V 1 ∪ V 2 ∪ V 3 ∪ . . . V^{+}=VV^*=V^{1}\cup V^{2}\cup V^{3}\cup ... V+=VV=V1V2V3...

2.正规式与正规集

  • ε和ϕ都是Σ上的正规式,它们所表示的正规集分别为{ε}和{ }
  • 对于任何a属于Σ,a是Σ上的一个正规式,它所表示的正规集为{a}
  • 假定e1和e2都是Σ上的正规式,它们所表示的正规集分别为L(e1)和L(e2),那么,(e1),e1|e2,e1·e2,e1*也都是正规式,它们所表示的正规集分别为L(e1),L(e1)并L(e2),L(e1)L(e2)和(L(e1))*
  • 仅由有限次使用上述三步骤而定义的表达式才是Σ上的正规式,仅由这些正规式所表示的集合才是Σ上的正规集

3.确定有限自动机(DFA)

在这里插入图片描述
在这里插入图片描述

4.不确定有限自动机(NFA)

在这里插入图片描述

在这里插入图片描述


5.子集法使NFA转化为DFA:

目的:把NFA的一组节点转化为DFA的一个节点(DFA的每一个状态对应NFA的一组状态)。通常,NFA易于人眼去识别,DFA更易于计算机去识别。DFA是NFA的特例。总结如下:

DFA和NFA的区别在函数的状态,比如DFA输入1只能到一个状态,而NFA可能有多个状态

NFA:设计容易,其不确定性使得识别单词符号的速度较慢

DFA:设计困难,占用空间太大,易于计算机实现

NFA到DFA的变换:子集构造法

正规式 => NFA => DFA


例:

Step1.正规表达式:
( a ∣ b ) ∗ a b (a|b)^*ab (ab)ab
Step2.NFA:
在这里插入图片描述

Step3.状态转换矩阵:

在这里插入图片描述

​ 从矩阵(表)中可以看出,每一个表格项通常是一个状态集合,(如状态0通过a弧可以到达状态0和状态1),而在DFA的矩阵表示中,表格项是一个状态。

​ NFA到相应的DFA的构造的基本思路是:

DFA的每一个状态对应NFA的一组状态

​ DFA使用它的状态去记录在NFA读入一个输入符号后可能达到的所有状态。

Step4.做好准备工作:

  1. 添加新的初态X和终态Y,将X指向所有初态并用ε弧链接,所有终态指向Y,并用ε弧链接。(为了使NFA的初态与终态唯一)。
  2. 对当前的NFA状态转换图M进一步替换得到新的状态转换图M’,且L(M)=L(M’) 。(即,1-2是为了将NFA转化为只有一个初态,且每个箭弧上只有一个字符的状态转换图)

在这里插入图片描述

Step5:子集法:

  1. ε-closure(X):从状态X出发,只经过ε转换能到达的所有状态的集合
    则上图中有:ε-closure(X)={X,0,1} 。即{0,1}中任一状态都是从状态0经任意条ε弧可到达的状态。令
    ε-closure(X)={X,0,1} =A。则move(A, a) = {0,2},而又有ε-closure({0,2})={0,1,2} 。为方便表示,我们取
    在这里插入图片描述
    于是,我们便有如下对应表:

在这里插入图片描述

含义:状态集I0通过a弧可以到达状态集I1,通过b弧可以到达状态集I2
所以,只需要吧所有状态集都找出来,不含有未知状态集,即完成了转换

  1. 将各个步骤求得的I,放入到状态集合S中,重复步骤1,直到没有没被放到状态集合S的状态集为止。
    在这里插入图片描述

    所有状态是指,没有新的状态产生了。比如I3没有产生I4或者I5,如有,则一直进行下去。

  2. 得到所有状态后,可以得出状态转换图:
    在这里插入图片描述

  3. 此时这个状态转换图就可以画出DFA了。
    初态为I0,终态为含有原终态的状态集。比如我这里终态是I3,因为它={0,1,3},含有原终态3 。(如果自己引入了终态Y,则是含有Y的状态集为终态)

    在这里插入图片描述

6.备注

例子正确性不保真,自己画图自己做的。方法论是自己参考后提炼出来的,大家理性参考一下即可,有错误欢迎指出。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值