NFA(不确定的有穷自动机)转化为DFA(确定的有穷自动机)

NFA转换DFA,通常是将带空串的NFA(即:ε-NFA)先转化为不带空串的NFA(即:NFA),然后再转化为DFA。

提示:ε是空串的意思!空串没有任何字符!

这里直接讲将ε-NFA转化为DFA的过程,将NFA转化为DFA的情况类似。

转化的过程总的来说有两大步骤:ε-NFA转化为DFA,以及DFA简化

ε-NFA转化为DFA前件知识

1、对状态图进行改造

增加状态X,Y,使之成为新的唯一的初态和终态,从X引ε弧到原初态节点,从原终态节点引ε弧到Y节点。

2、利用子集法对NFA进行确定化。

  • 子集法

子集法:将NFA转化为接受同样语言的DFA。

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

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

如上图,A对应ε-NFA的0和1状态,A代表的是一组状态。因此,DFA使用它的状态去记录NFA读入一个符号后可能达到的所有状态。

  • 构造状态转化表

    • ε-closure(ε-闭包)

状态集合I的ε-闭包是一状态集。

任何状态q∈I,则q∈ε-closure(I)

任何状态q∈I,则q经任意条ε弧而能到达的状态q'∈ε-closure(I)

比如上图,假设I={0},那么0∈ε-closure(I);并且0经ε弧能到达1状态,因此,1∈ε-closure(I)。即:ε-closure({0})={0,1}。

案例再现

可能前面的理论有些乱,理不清,这里用一个例题演绎如何将ε-NFA转化为DFA。

已知下面的NFA图,求确定后的DFA:

①改造状态图:在起始状态分别加上X、Y状态,连接输入符号为ε。

②状态转换表

状态集合 \状态 0 1
A={X,0,2,1} B={2,3,1} C={2,1}
B={2,3,1} D={2,4,3,1,Y} C={2,1}
C={2,1} B={2,3,1} C={2,1}
D={2,4,3,1,Y} D={2,4,3,1,Y} C={2,1}

!提示:A,B,C,D表示状态集合;0,1分别表示状态0和1。第二行第二列表示状态集合A的状态在输入符号0后到达的状态的ε-闭包为B={2,3,1}

获得改造后的状态图后,我们找到起始状态为X,由于X与0之间是输入的ε符号,所以X与0等价;同理,0与2等价,1与2等价。所以,起始状态有{X,0,2,1},我们给它命名为状态A。

再看第二列,处于起始状态A时,当输入字符为0时到达的状态分别有:2输入0到达2本身;1输入0到达3,因此还有3状态。再看与2等价的状态有:1;与3等价的状态无。因此,输入字符0时到达的状态有{2,3},它的闭包是:{2,3,1}。

第三列同理,处于起始状态A时,当输入字符为1时到达的状态只有2。2的等价状态有1。因此,输入字符1时A到达的状态有{2},它的闭包是{2,1}。

!注意:状态转换表里面填入的是闭包结果。

最后得到的DFA图为:(未简化)

DFA简化

状态S和状态T等价的条件
  • 一致性条件:状态S和T必须同时为可接受状态不可接受状态
  • 蔓延性条件:对于所有符号,状态S和T必须转换到等价的状态里。
DFA简化算法:

1、假定一个集合中的状态都是等价的,首先将DFA的所有状态放在一个集合I中。

2、所有状态分成两个子集——终态集和非终态集。运用判定状态等价原则分别对两个子集的状态进行分析和划分。若发现某个状态与其他状态不等价,则将其作为一个新的状态子集,如果无法区分,则放在同一子集中。

3、从每个子集中选出一个状态做代表,即可构成简化的DFA。

4、含有原来初态的子集仍为初态,各终态的子集仍为终态。

案例再现

将上面未简化的DFA图简化:

①I = {A,B,C,D}

②拆分终态集和非终态集:

非终态集{A,B,C}+终态集{D}

③对{A,B,C}继续拆分:

A输入0后到达B,而B⊆{A,B,C},故A不能拆分;

再看B,B输入0后到达D,而D{A,B,C},故B可以拆分;

再看C,C输入0后到达B,B⊆{A,B,C},故C也不能拆分。

综上:{A,B,C}可拆分为{A,C}+{B}。

④对{A,C}继续拆分:

A输入1时到达C,而C⊆{A,C},故A不可拆分;

再看C,C输入1时到达C状态,而C⊆{A,C},故C也不可拆分。

⑤综合起来,上面未简化的DFA图简化后得到的状态应该是:{A,C}+{B}+{D}。

!注意:同一个{}大括号里面的状态是等价的,因此,画图时选其一即可。

简化后的DFA图为:

Are you got it?(你学会了吗?)

NFA转化为DFA的更多相关文章

  1. 非确定的自动机NFA确定化为DFA

    摘要: 在编译系统中,词法分析阶段是整个编译系统的基础.对于单词的识别,有限自动机FA是一种十分有效的工具.有限自动机由其映射f是否为单值而分为确定的有限自动机DFA和非确定的有限自动机NFA.在非确 ...

  2. 第八次作业-非确定的自动机NFA确定化为DFA

    NFA 确定化为 DFA 子集法: f(q,a)={q1,q2,…,qn},状态集的子集 将{q1,q2,…,qn}看做一个状态A,去记录NFA读入输入符号之后可能达到的所有状态的集合. 步骤: 1. ...

  3. 编译原理之非确定的自动机NFA确定化为DFA

    1.设有 NFA M=( {0,1,2,3}, {a,b},f,0,{3} ),其中 f(0,a)={0,1}  f(0,b)={0}  f(1,b)={2}  f(2,b)={3} 画出状态转换矩阵 ...

  4. 作业八——非确定的自动机NFA确定化为DFA

    NFA 确定化为 DFA 子集法: f(q,a)={q1,q2,…,qn},状态集的子集 将{q1,q2,…,qn}看做一个状态A,去记录NFA读入输入符号之后可能达到的所有状态的集合. 步骤: 1. ...

  5. 第八次——非确定的自动机NFA确定化为DFA

    NFA 确定化为 DFA 子集法: f(q,a)={q1,q2,…,qn},状态集的子集 将{q1,q2,…,qn}看做一个状态A,去记录NFA读入输入符号之后可能达到的所有状态的集合. 步骤: 1. ...

  6. 编译原理:非确定的自动机NFA确定化为DFA

    1.设有 NFA M=( {0,1,2,3}, {a,b},f,0,{3} ),其中 f(0,a)={0,1}  f(0,b)={0}  f(1,b)={2}  f(2,b)={3} 画出状态转换矩阵 ...

  7. 第八次-非确定的自动机NFA确定化为DFA

     提交作业 NFA 确定化为 DFA 子集法: f(q,a)={q1,q2,…,qn},状态集的子集 将{q1,q2,…,qn}看做一个状态A,去记录NFA读入输入符号之后可能达到的所有状态的集合. ...

  8. 编译原理-NFA转化成DFA

    1.假定NFA    M=<S,∑,f,S0,F>    对M的状态转换图进行以下改造: ①引进新的初态结点X和终态结点Y,    X,Y∈S,    从X到S0中的任意结点连一条ε箭弧, ...

  9. 正规式转化为DFA

    https://www.bilibili.com/video/BV1dj411f7AR?p=50 例题:

随机推荐

  1. 一文读懂mysql权限系统

    前言: MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT.INSERT.UPDATE和DELETE权限.附加的功能包括有匿名的用户并对于MySQL特定 ...

  2. 如何在Xamarin中快速集成Android版认证服务-手机号码篇

    Xamarin作为微软提供的移动服务多系统开发平台,成为很多开发者首选的应用开发平台.AppGallery Connect(以下简称AGC)也在逐步的支持Xamarin的SDK.认证服务也是支持Xam ...

  3. Servlet-整个Servlet类的继承体系

  4. 计算机网络再次整理————tcp[二]

    前言 本文不会去介绍tcp的具体协议,因为这个tcp 应该不能说是单纯的连接和传输数据这么简单,里面还有很多机制. 正文 首先介绍一下什么是协议族(protocal Family),举个例子PF_IN ...

  5. 「JOISC 2014 Day1」巴士走读

    「JOISC 2014 Day1」巴士走读 将询问离线下来. 从终点出发到起点. 由于在每个点(除了终点)的时间被过来的边固定,因此如果一个点不被新的边更新,是不会发生变化的. 因此可以按照时间顺序, ...

  6. 微服务 架构 php+go

    p.p1 { margin: 0; font: 13px "Helvetica Neue"; color: rgba(0, 162, 255, 1) } 微服务  架构  php+ ...

  7. BeanUtils JavaBean 工具包使用

    感谢原文作者:小老弟 原文链接:https://www.cnblogs.com/syncmr/p/10523576.html 目录 简介 BeanUtils类 使用示例 ConvertUtils 功能 ...

  8. 一行代码为UITextField添加收键盘功能

    iOS开发中收键盘是十分常用的功能,只需一行代码即可为ViewController添加工具条收键盘功能 更重要的是使用catogory,无代码污染. 代码 // UITextField+keyboar ...

  9. dealloc方法

    dealloc方法基本概念 当一个对象的引用计数器值为0时,这个对象即将被销毁,其占用的内存被系统回收 对象即将被销毁时系统会自动给对象发送一条dealloc消息 (因此, 从dealloc方法有没有 ...

  10. 有关 iOS 的开发证书、应用标识、设备标识、配置文件以及密钥 #DF

    iOS开发过程中如果需要进行真机调试.发布需要注册申请很多证书, 以下是对iOS开发的常用证书和密钥等的逐一简单说明: 证书 iOS常用的证书包括开发证书和发布证书,无论是真机调试还是最终发布应用到A ...