将NFA变成最小化DFA的方法

2023-11-03

学习的时候总感觉这个遇到新的题目不会做,这里总结一下

整个流程是这样的
在这里插入图片描述
我们直接来看一个例子,使用上面的算法来实现我们最后的目标
(a|b)*ba(ab)*

我们先来画NFA

明确:开始状态和接受状态,终结状态要画两个圈,值得注意的是,由于*也可以代表出现了0次,10号状态也是接受状态
在这里插入图片描述

NFA画好了,我们继续采用子集构造算法,整个过程繁而不难

举个例子,对S1={1,2,3,5,8}
如果此时收到‘a’,我们可以轻易画出转移的路线{1->{},2->{},3->{4,7,8,2,3,5},5->{},8->{}}
把他们合并起来,即S1通过a到S2={2,3,4,5,7,8}
如果此时收到’b’,同理画出路线{1->{},2->{},3->{},4->{},5->{6,7,8,2,3,5},8->{9}}
把他们合并起来,即S1通过b到S3={2,3,5,6,7,8,9}

S a b
S1={1,2,3,5,8} S2={2,3,4,5,7,8} S3={2,3,5,6,7,8,9}
S2={2,3,4,5,7,8} S2={2,3,4,5,7,8} S3={2,3,5,6,7,8,9}
S3={2,3,5,6,7,8,9} S4={2,3,4,5,7,8,10,11,14} S3={2,3,5,6,7,8,9}
S4={2,3,4,5,7,8,10,11,14} S5={2,3,4,5,7,8,12} S3={2,3,5,6,7,8,9}
S5={2,3,4,5,7,8,12} S2={2,3,4,5,7,8} S6={2,3,5,6,7,8,9,11,13,14}
S6={2,3,5,6,7,8,9,11,13,14} S5={2,3,4,5,7,8,12} S3={2,3,5,6,7,8,9}
S a b
S1 S2 S3
S2 S2 S3
S3 S4 S3
S4 S5 S3
S5 S2 S6
S6 S5 S3
画出我们的DFA即可

只要记住对每个状态我们都要询问从a可以走到哪,从b可以走到哪,这样状态就不会遗漏
我们要给接受状态画两个圈圈,S4、S6包含我们的接受状态
在这里插入图片描述

结束了吗?还没有,我们要用Hopcroft最小化子集的算法

这个算法先把集合分成两个初始的集合,一个是接受状态,一个是非接受状态
Non-Accept={S1,S2,S3,S5}
Accept={S4,S6}
不如先考察Non-Accept集合吧
接受‘a’,S1->S2,S2->S2,S3->S4,S5->S2
我们发现可以把{S1,S2,S5}分成一类,{S3}自成一派
继续,考虑{S1,S2,S5}
接受‘a’,他们最终都会变成S2,显然这个不是一个划分
接受’b’呢?S1->S3,S2->S3,S5->S6
我们又得到了一个划分
{S1,S2} {S5}
无法继续划分了
对Accept集合,我们发现无论是’a’还是‘b’都不能把它俩分开,干脆让他俩在一个集合里好了
在这里插入图片描述
如果还不懂的话,可以看一下这个论文
https://www.docin.com/p-553259613.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将NFA变成最小化DFA的方法 的相关文章

  • 电子科技大学编译原理复习笔记(八):语义分析

  • flex&bison编写语法分析器

    使用flex和bison 对c语言代码块进行词法分析 识别词法错误 按照c 语法规则进行文法分析 并形成c语言代码块的语法树 syntax tree 并将语法树按照特定的格式打印出来 如何编译 两种方法 1 使用make命令 先将要执行的所
  • 合肥工业大学编译原理实验二 LL1分析

    写在开头 当老师说这个实验最好写成图形界面时 我笑了 滑稽 心想终于可以用到python了 python真香 用python的数据结构可以很方便的表示LL1的某些东西 当然有利也有弊 方便的同时也会有一些坑 当然Java也牛逼 Java的图
  • 【编译原理】FIRST集合和FOLLOW集合

    FIRST集合 定义 可从 推导得到的串的首符号的集合 其中 是任意的文法符号串 规则 计算文法符号 X 的 FIRST X 不断运用以下规则直到没有新终结符号或 可以被加入为止 1 如果 X 是一个终结符号 那么 FIRST X X 2
  • 深入浅出编译原理-5-一个简单语法分析器的C语言实现

    引言 前面已经介绍了编译器的预处理 词法分析 词法分析器的实现 也在其中说到了语法分析的任务和过程 语法分析的输入是词法单元序列 然后根据语言的文法表示 展开式 利用有限状态机理论 生成抽象语法树 然后遍历得到中间代码 即 三地址码 本节就
  • 编译原理 实验一 词法分析器设计

    一 实验目的 1 深入理解有限自动机及其应用 2 掌握根据语言的词法规则构造识别其单词的有限自动机的方法 3 基本掌握词法分析程序的开发方法 4 能够设计词法扫描器程序 对源程序进行词法分析 并输出单词序列 二 实验内容及要求 编写识别单词
  • 编译原理之first集,follow集,select集解析

    为了方便自顶向下语法分析 需要求文法对应的first集 follow集 以及select集 本文主要分为两部分 一个是求法解析 还有一个例子详解 第一部分是求法解析 将对first集 follow集 select集分为三种讲解方法 定义介绍
  • Code Block & Basic Block

    Code Block In a programming language a code block typically starts with certain syntactical constructs such as loops con
  • 移入——归约技术

    归约 定义 我们可以将自底向上语法分析过程看成是建一个串w 归约 慰问发开始符号的过程 在归约中 一个与某产生式体相匹配的特定子串被替换为该产生式的头部的非终结符号 定义理解起来比较晦涩 我们来看个例子就知道了 已知有文法 E gt E T
  • LLVM IR / LLVM指令集入门

    本文基于LLVM 12官方文档的LLVM Language Reference Manual 以学习笔记为主 所以本文会摘录一些常见 常用的指令 对于一些更加深层次的指令属性 特性 待我对LLVM有更深的理解再单独写文章记录 1 LLVM
  • 编译原理基础知识+笔记(1)

    一 编译原理概述 1 翻译程序 把某一种语言程序 称为源语言程序 等价地转换成另一种语言程序 称为目标语言程序 的程序 2 编译程序 把某一种高级语言程序等价地转换成另一种低级语言程序 如汇编语言或机器语言程序 的程序 又分为 诊断编译程序
  • 【编译原理】课程一:编译原理入门

    目录 1 为什么要学习编译原理 2 什么是编译原理 3 编译与计算机程序设计语言的关系 3 1 程序设计语言的转换方式 3 2 编译的转换过程 3 3 编译器在语言处理系统中的位置 3 4 编译系统的结构 3 4 1 词法分析 扫描 3 4
  • cucu: a compiler you can understand (part 1)

    原文地址 http blog csdn net roger wong article details 8498591 译者序 最近在学习一些编译器的基本知识 就找到了这篇英文的博客 在csdn搜了一下貌似没有人翻译 所以我干脆翻译了算了 反
  • LLVM SSA 介绍

    最近做研究碰到了一个难题 需要对程序变量按生命期进行重命名 考虑到 SSA 中一个变量在不同的程序分支中赋值时会进行重命名 因此打算以此作为参考 看看能否采取同样的方法达到目的 由于之前看到的文档中都说 LLVM IR 是 SSA 形式的
  • OCaml 安装以及简单的加减乘除Demo(以Ubuntu16.04为例)

    安装nix 参考 https mirrors tuna tsinghua edu cn help nix 安装nix sh lt curl https mirrors tuna tsinghua edu cn nix latest inst
  • arm-linux-gcc char与signed char和unsigned char

    1 三者关系 1 ANSI C 提供了3种字符类型 分别是char signed char unsigned char 而不是像short int一样只有两种 int默认就是unsigned int 2 三者都占1个字节 3 signed
  • 编译原理-总概

    语言执行过程 代码 解释器编译器 机器代码 cpu执行 编译型语言 在程序在执行之前需要一个专门的编译过程 通过编译器把程序编译成为可执行文件 再由机器运行这个文件 运行时不需要重新翻译 直接使用编译的结果就行了 解释型语言 是一边执行一边
  • 正规表达式与有限自动机

    1 美图 2 概念 3 正规式和正规集 正规集可以用正规表达式 简称正规式 表示 正规表达式是表示正规集一种方法 一个字集合是正规集当且仅当它能用正规式表示 3 1 正规式和正规集的递归定义 4 确定有限自动机 DFA
  • 编译原理实验:使用C/C++语言编写C-语言的词法分析器

    文章目录 实验目的 实验任务 实验内容 实验步骤 分析c 的词法规则 算法基本思想 Step1 find token Step2 DFA状态图构建 Step3 使用while switch双循环将DFA代码化 主程序流程 各程序模块之间层次
  • LLVM是如何编译指令的

    本文将会通过一条指令在LLVM中的不同阶段 从源程序语言中的语义结构到成为机器二进制码来研究LLVM的工作原理 本文不会介绍LLVM是如何工作的 这需要理解LLVM的设计以及code以及各种细节 输入代码 我们从一段C代码开始探险 如下 i

随机推荐

  • IDEA的import类和pom文件头被标红,但可以正常编译打包(四种解决方案)

    IDEA的import类和pom文件头被标红 但可以正常编译打包 四种解决方案 问题背景 方案一 方案二 方案三 方案四 心得 Lyric 雨点从两旁划过 问题背景 昨晚回家没有关电脑 也没关IDEA 今早看IDEA的时候 居然莫名其妙出现
  • 写1清0与写0清零:单片机中断服务函数为什么要用写1清零中断标志位?

    前记 第一次使用risc的单片机 照着datasheet和demo边研究边写 因为之前使用51单片机基本都是照着demo CTRL C V 然后自己改改逻辑 这样一个项目也就差不多了 很多原理其实没搞太清楚 借着这个机会 好好补一补 原理搞
  • Maven安装教程

    一 下载安装包Maven Download Apache Mavenhttps maven apache org download cgi 二 配置maven环境 1 将压缩包放到自己想要存放的目录 2 复制Maven的根路径 注意不是bi
  • Raki的读paper小记:RWKV: Reinventing RNNs for the Transformer Era

    Abstract Introduction Related Work 研究任务 基础模型架构 已有方法和相关工作 RNN CNN Transformer 稀疏注意力 Beltagy等人 2020年 Kitaev等人 2020年 Guo等人
  • GLES3.0中文API-glGetProgramResourceName

    名称 glGetProgramResourceName 查询程序中已索引资源的名称 C 规范 void glGetProgramResourceName GLuint program GLenum programInterface GLui
  • 接口api 之Swagger 一次实战探索

    今天我们来说说什么是Swagger 就是把相关的信息存储在它定义的描述文件里面 yml或json格式 再通过维护这个描述文件可以去更新接口文档 以及生成各端代码 而Springfox swagger 则可以通过扫描代码去生成这个描述文件 好
  • 问题 E: [蓝桥杯2016初赛]交换瓶子

    题目描述 有N个瓶子 编号 1 N 放在架子上 比如有5个瓶子 2 1 3 5 4 要求每次拿起2个瓶子 交换它们的位置 经过若干次后 使得瓶子的序号为 1 2 3 4 5 对于这么简单的情况 显然 至少需要交换2次就可以复位 如果瓶子更多
  • STM32 基本定时器实验

    1 基本定时器简介 时钟源 时钟挂载在APB1总线下 中间有一个倍频器 sys stm32 clock init时钟已经设置APB1总线时钟频率为36M 预分频器分频系数为2 所以挂载在APB1总线的定时器时钟频率为72Mhz 图中对应的时
  • node mysql 连接 时区_Nodejs Date 保存到mysql中时区问题,处理方法

    nodejs中mysql用法 1 建立数据库连接 createConnection Object 方法 该方法接受一个对象作为参数 该对象有四个常用的属性host user password database 与php中链接数据库的参数相同
  • ArrayLIst、HashMap

    底层维护了一个Objec的数组 创建对象时 初始大小是0 第一次新增元素时扩容为10 再次扩容为1 5倍 扩容的时机是内部数组满了之后 再次add才会扩容 非线程安全 线程安全的Vector HashMap jdk7以前为数组 链表 搜索的
  • 数据结构知识点汇总

    1 用链表表示线性表的优点是 便于插入和删除操作 2 单链表中 增加头结点的目的是 方便运算的实现 3 栈和队列的共同特点是 只允许在端点处插入和删除元素 4 栈通常采用的两种存储结构是 线性存储结构和链表存储结构 5 队列具有 先进先出
  • Lamport 逻辑时钟

    分布式系统中按是否存在节点交互可分为三类事件 一类发生于节点内部 二是发送事件 三是接收事件 注意 以下文章中提及的时间戳如无特别说明 都指的是Lamport 逻辑时钟的时间戳 不是物理时钟的时间戳 如果a在进程Pi中 b在进程Pj中 Ci
  • 今日分享积累的5个AI绘画网站,好用且免费

    AI绘画即基于人工智能的绘画技术 让设计师能够以全新的方式创作出惊人的艺术作品 而随着AI绘画技术的发展 市面上也多了很多能免费使用的AI绘画网站 可以为我们提供更多的绘画灵感和创作可能性 接下来我将为大家推荐5个能免费使用的AI绘画网站
  • ngrok搭建服务器(超级详细)

    前言 我一直都在usr local文件下操作 有不懂的同学给我留言 我没有修改源码 只是测试能否生成服务端文件 有需要的同学可以修改源码 使用 ip 做域名时 随机生成的子域名导致地址错误解决办法就是改源码 去掉随机生成 在ngrok目录下
  • WAIC2023:图像内容安全黑科技助力可信AI发展

    目录 0 写在前面 1 AI图像篡改检测 2 生成式图像鉴别 2 1 主干特征提取通道 2 2 注意力模块 2 3 纹理增强模块 3 OCR对抗攻击 4 助力可信AI向善发展 总结 0 写在前面 2023世界人工智能大会 WAIC 已圆满结
  • python insert插入新一列

    mydata insert 1 date data 日期 mydata 原有数据 1 插入第几列 data 插入列名 data 日期 插入列内容 原有数据插入一列 mydata insert 1 date data 日期 mydata 原有
  • 快速构建Kubesphere 3.0并设置Kubesphere 多集群联邦

    这里我们Host选择使用单节点All in One安装模式 可以零配置快速部署 KubeSphere和Kubernetes 我们安装联邦集群需要有一台节点进行管理 Member需要在Kubernetes中安装Kubesphere当作Memb
  • 目标检测pytorch版yolov3五——解码过程和可视化以及predict预测过程

    本篇博客是我学习某位up在b站讲的pytorch版的yolov3后写的 那位up主的b站的传送门 https www bilibili com video BV1A7411976Z 他的博客的传送门 https blog csdn net
  • c/c++linux后台服务器开发如何提升?(路线图已备好)

    随着业务市场的不断壮大 更便捷的开发语言也越来越受到市场的欢迎 Java python还有新贵golang 那c c 语言的开发者市场在哪里 虽然说没有活干说的可能过于夸张 但是面临的事实就是比不了 可能初学一点Java python等等就
  • 将NFA变成最小化DFA的方法

    学习的时候总感觉这个遇到新的题目不会做 这里总结一下 整个流程是这样的 我们直接来看一个例子 使用上面的算法来实现我们最后的目标 a b ba ab 我们先来画NFA 明确 开始状态和接受状态 终结状态要画两个圈 值得注意的是 由于 也可以