细讲如何对NFA确定化和最小化

NFA的确定化和最小化

🌵🌵🌵前言

  期末在即,编译原理的考试真让人头疼,不得不利用这短暂的时间把编译原理的诸多大题过一遍。
在这里插入图片描述
如果感兴趣可以参观博主其他一些有关编译原理的相关习题详解,相关文章可以在主页查看:
​✈️ 传送门


🌴🌴相关概念

  • 什么是有穷自动机?

    有穷自动机(也称有限自动机)是一种识别装置,能准确识别正规集,即正规文法正规式 所表示的集合。

    其中可分为:确定的有穷自动机(DFA)和 非确定的有穷自动机(NFA

  • DFA: M ( K , Σ , f , S , Z ) M(K,Σ,f,S,Z) M(K,Σ,f,SZ)
    • K K K:是所有状态的集合(一般状态用大写字母或者阿拉伯数字表示)
    • Σ Σ Σ:是所有输入符号的集合(一般输入符号用小写字符表示)
    • f f f:是一种单值映射关系1(一般表示: ( K i , Σ i ) = K j (K_i,Σ_i)=K_j (Ki,Σi)=Kj,即状态 K i K_i Ki后面输入字符 Σ i Σ_i Σi得到状态 K j K_j Kj
    • S S S:表示初始状态(是唯一的)
    • Z Z Z: 表示一个终态集(不唯一,终止状态可以有多个)
  • NFA: M ( K , Σ , f ′ , S ′ , Z ) M(K,Σ,f',S',Z) M(K,Σ,f,SZ)
    • K K K:是所有状态的集合(一般状态用大写字母表示)
    • Σ Σ Σ:是所有输入符号的集合(一般输入符号用小写字符表示)
    • f ′ f' f:是一个 K × Σ ∗ K×Σ^* K×Σ到全体子集的映像(一般表示: K × Σ ∗ → 2 k K×Σ^*\rightarrow{2^{k}} K×Σ2k
    • S ′ S' S:表示非空初状集(不唯一,在DFA种可以有多个非空初状态)
    • Z Z Z: 表示一个终态集(不唯一,终止状态可以有多个)

其实DFA是NFA的一种特殊情况。两者的主要区别:

  • NFA函数关系 f ′ f' f既可以多值映射又可以单值映射,而DFA中的函数关系 f f f只能单值映射
  • NFA的初状态非空不唯一,而DFA初状态非空且唯一
  • NFA可以带空(ε)转换,DFA不能
  • 什么是确定化?为什么要确定化?

    确定化就是将NFA转换成DFA的过程。
    在非确定的有穷自动机种(NFA)中,由于状态的转移需要经过若干步,并且每一步都是不可预测的,对后续输入的字符存在一个试探的过程。而在试探的过程中可能会带来重复的步骤,这无疑是增加了程序的运行时间同时降低了工作效率,将NFA转成DFA进行确定化就是为了增加程序的效率缩短工作时间。

  • 什么是最小化?为什么要最小化?

    DFA的最小化就是寻求状态数最小的与原DFA等价的DFA。最小化可以降低编译器构造的复杂度、 提高编译器的运行效率


🌴🌴实战例题

  • NFA确定化方法:
    • 子集法:(假设输入字符集 Z = { a , b } Z=\{a,b\} Z={a,b}
      Step1:设置三列: I 、 I a 、 I b I、I_a、I_b IIaIb
      Step2:第一行,求初始态S对ε的推导得到字符集①写入第一列。求对①输入字符ε、a的推导得到字符集 ① ′ ①' 写入第二列。求①对输入字符ε、b的推导得到符号集 ① ′ ′ ①'' 写入第三列;
      Step3:第二行,观察 ① ′ ①' 是否与第一列 I I I有重复,重复则跳过,不重复就写入第二行第一列,重新记作字符集②。求②对字符ε、a的推导得到字符集 ② ′ ②' 写入第二列。求②对字符ε、b的推导得到字符集 ② ′ ′ ②'' 写入第三列;
      Step4:第三行,以 ① ′ ′ ①'' 为标准进行判断,求相应 I a 和 I b I_a和I_b IaIb所对应的字符集
      ……持续递推,直到无法产生新的字符集
    • 造表法:
      • Step1:将NFA的转换图转换成以状态为行,输入为列的图表
      • Step2:对原有的状态图进行重新标记

两种方法相比较,我更喜欢造表法,因为它的解题步骤更加简洁,但是对于计算机而言,需要使用子集法来实现

  • NFA的最小化:(假设输入字符集 Z = { a , b } Z=\{a,b\} Z={a,b}
    • Step1:初始划分,将DFA按照非终态和终态划分成两个集合A,B
    • Step2 I a I_a Ia划分,将A,B集合中的元素,按照其 I a I_a Ia属于A还是B进一步划分成A1,A2,B1,B2。
    • Step3 I b I_b Ib划分。将A1,A2,B1,B2集合中的元素,按照其 I b I_b Ib属于A1,A2,B1,B2中的哪一个进一步划分成A12,A22,B12,B22
    • Step4:上面划分完成的集合重命名为状态0,1,2,3
    • Step5:画出相应的状态图,即为最小NFA

🌱附上例题
例1:
将下图(a)和(b)确定化和最小化。
在这里插入图片描述
解 : ( 1 ) 对 图 ( a ) : 解:\\ (1)对图(a): 1a:
首先可知图(a)是一个NFA,对其进行确定化,如下所示:
将图(a)NAF的状态转换图转换成DAF的矩阵状态转换图:

I I I I a I_a Ia I b I_b Ib
{ 0 } \{0\} {0} { 0 , 1 } \{0,1\} {0,1} { 1 } \{1\} {1}
{ 0 , 1 } \{0,1\} {0,1} { 0 , 1 } \{0,1\} {0,1} { 1 } \{1\} {1}
{ 1 } \{1\} {1} { 0 } \{0\} {0} Ø Ø Ø

所以图(a)对应的DFA为:

I I I I a I_a Ia I b I_b Ib
012
112
20 Ø Ø Ø

得到相应的DFA转换图:(含有终态节点就用双圈)
在这里插入图片描述
最小化后的NFA为:
在这里插入图片描述

说明:
I I I表示状态集合的ε闭包,可记作: ε − c l o s u r e ( I ) ε-closure(I) εclosure(I)。大白话就是:初始状态自身以及自身能通过ε到达的状态的集合。
I a I_a Ia表示状态集合的 I I I a a a弧转换,可记作: m o v e ( I , a ) , move(I,a), move(I,a)大白话就是: I a I_a Ia集合就是 I I I集合中的元素经过 ε或者a 能到达的状态所组成的集合, I b I_b Ib同理。

解题分析

由图可知对于状态0,存在函数关系f(0,a)=1、f(0,a)=0,显然状态0对于输入字符a的函数关系f是多值映射,故图(a)是NFA转换图

对于确定化:

  • Step1:对于初状态0,因为(a)图中没有ε转换,故集合①就是状态 { 0 } \{0\} {0}
  • Step2:此时 I I I={0},此时图中没有 ε ε ε弧,不用管ε,但是有a,状态0经过a可到达状态0和1,所以 I a = { 0 , 1 } I_a=\{0,1\} Ia={01},同理可求得 I b = { 1 } I_b=\{1\} Ib={1}
  • Step3:观察第一行的 I a I_a Ia是否已存在第一列,显然第一列 I I I中没有存在上一行的 I a I_a Ia,故将它第二行的 I I I中,继续求得这一行的 I a I_a Ia I b I_b Ib
  • Step4:观察第一行的 I b I_b Ib是否已存在第一列,显然第一列 I I I中没有存在上一行的 I b I_b Ib,故将它第二行的 I I I中,继续求得这一行的 I a I_a Ia I b I_b Ib
  • Step5:观察第二行的 I a I_a Ia是否已存在第一列,显然第一列 I I I中已存在 { 0 , 1 } \{0,1\} {0,1},故跳过,进行第二行的 I b I_b Ib判断,经过观察易发现后续的 I a I_a Ia I b I_b Ib都是 I I I中已存在的。所以可以得出结论,该DNF已转换成了DNF完成了确定化
  • Step6:将 I I I列自上而下重新命名为状态:0、1、2
  • Step7:然后将对应的命名填写入 I a I_a Ia I b I_b Ib中,即为最终结果
    总的来将,NFA的确定化就是递推求解,再对所求集合进行重新命名,最终根据所求表画出相应的DNF状态图的过程

对于最小化:

  • Step1::根据集合是否包含终态节点0,可划分为终止态和非终止态 A = { 0 ′ , 1 ′ } A=\{0',1'\} A={0,1} B = { 2 } B=\{2\} B={2}
  • Step2::经过观察可以知道, 0 ′ 0' 0对应的 I a = 1 ′ ⊆ A , 同 时 1 ′ 对 应 的 I a 同 样 属 于 A I_a={1'}⊆A,同时1'对应的I_a同样属于A Ia=1A1IaA,故当前无需划分;对于{2}只有一个元素也无需划分
  • Step3::同理后续 0 ′ 0' 0对应的 I b = 1 ′ ⊆ B , 同 时 1 ′ 对 应 的 I b 同 样 属 于 B I_b={1'}⊆B,同时1'对应的I_b同样属于B Ib=1B1IbB,故当前无需划分
  • Step4:当前无可划分集合,划分完成

( 2 ) 对 于 图 ( b ) : (2)对于图(b): 2b:
显然可知其本身就是一个DFA,因为他不存在多值映射关系,故不需要确定化。先对其进行最小化:

  • Step1:初始划分。 A = { 0 , 1 } , B = { 2 , 3 , 4 , 5 } A=\{0,1\},B=\{2,3,4,5\} A={0,1},B={2,3,4,5}
  • Step2 I a 划 分 I_a划分 Ia。对于集合A中的元素,由图可知,0对应的 I a I_a Ia是1,1对于的 I a I_a Ia是0,0和1同属于A,故无需划分;对于集合B中的元素,由图可知,2对应的 I a I_a Ia是1,3对应的 I a I_a Ia是3,4对应的 I a I_a Ia是0,5对应的 I a I_a Ia是5,故可进一步划分成集合 B 1 { 2 , 4 } , B 2 = { 3 , 5 } B1\{2,4\},B2=\{3,5\} B1{2,4},B2={3,5}
  • Step3 I b 划 分 I_b划分 Ib。对于集合A中的元素,,0对应的 I b I_b Ib是2,,1对应的 I a I_a Ia是4,2和4同属于集合B1,故无需划分,同理可知B1,B2中的元素也无需划分,划分完成
  • Step4:将划分的集合重新编号0,1,2,根据划分画出相应的状态转换图,如下:

在这里插入图片描述
例2:
将下图的NFA确定化:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例3:
将图中的DFA最小化
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


  1. 状态经过后面的输入只能到达除自身以外的唯一一个状态 ↩︎

  • 74
    点赞
  • 420
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
3.17 NFA(非确定有限自动机)确定是指将一个非确定有限自动机转换为确定有限自动机的过程。在非确定有限自动机中,一个输入可能对应多个状态转移,使得状态转移过程不确定。而确定有限自动机每个输入只能对应一个状态转移,使得状态转移过程确定性。 在进行确定的过程中,首先需要构建一个等价的确定有限自动机,然后通过状态合并和状态转移的方式将非确定有限自动机转换为确定有限自动机。具体过程包括以下几个步骤: 1. 确定的初始状态:确定需要选择一个状态作为确定的初始状态,通常选择非确定有限自动机中的起始状态作为确定的初始状态。 2. 确定的状态合并:对非确定有限自动机中的状态进行合并,将多个状态合并成一个新的状态,以构建确定有限自动机的状态集合。 3. 确定的状态转移:根据非确定有限自动机中的状态转移规则,确定的状态转移需要根据合并后的新状态进行调整,以确保确定有限自动机的状态转移是唯一的。 4. 确定的接受状态:确定需要确定哪些状态是接受状态,即确定有限自动机中的终止状态。 通过以上步骤,可以将非确定有限自动机确定为等价的确定有限自动机,使得状态转移过程变得明确和确定确定可以帮助我们更好地理解和分析自动机的行为,以及简自动机的设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识汲取者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值