编译原理——正规式、NFA构造DFA

news2024/11/18 15:42:27

一、DFA和NFA的区别

NFA:非确定有限自动机
DFA:确定有限自动机
NFA在同一状态,可以有多条出边,DFA在同一状态,只能有一条出边;
NFA的初态可以具有多个,DFA的初态是唯一的;
在这里插入图片描述
比如这个图就是NFA,因为0可以通过输入一个字符a到达本身,还可以通过a到达1,这就是在同一状态,有多条出边;

二、构造DFA

下图有三条重要的转换规则,在通过正规式构造NFA图时用到的;
在这里插入图片描述

1. 通过正规式构造DFA(核心)

例题

在这里插入图片描述
这个题就是给你正规式,让你构造DFA,通过第一个正规式进行示例:

(1)把正规式转换为NFA

使用上面的三个规则,可以将正规式最终转化为一个NFA图
在这里插入图片描述

(2)把NFA通过子集构造法转换为DFA(确定化)
①先根据NFA图,画出状态转换矩阵如下:

在这里插入图片描述

②可以对矩阵进行编号,然后用其编号,画DFA的状态转换图:

在这里插入图片描述

③根据上面已经编过号的图,画出DFA的状态转换图,集合含终态的元素,注意要画两个圈圈

在这里插入图片描述

(3)把DFA通过分割法进行化简(最小化)
①最小化的分析过程

我这里刚开始写的比较繁琐,主要是方便理解,做熟悉的话,可以直接写出不成立条件,从集合里拆分出来即可,没必要把成立的也写一遍;这题最终确定的集合为:{0},{1,2},{3},{4},{5},那么就可以删除一个点 2,因为1可以替代它;
在这里插入图片描述

②画出化简后的DFA状态转换图

通过和化简前的对比可以发现,没有删除的点,它都不变;把删除的点的自环传给替代它的点,把2的入边(原来指向2的边,现在指向它的替代,也就是指向1),2的出边(就是由2引出去的边)不用管;
在这里插入图片描述

2.通过NFA图构造DFA

这种类型题其实和上面一样,只不过比上面少一步,不需要自己把正规式转化为NFA;

例题

在这里插入图片描述
第一问,对于图a,和上面一样,先画出状态转换矩阵,对矩阵进行编号,然后画出DFA,然后通过分割法进行化简,然后画出化简后的DFA即可;
在这里插入图片描述
第二问直接分割法化简,然后根据化简结果,删除一些非必要的点画出DFA即可;
在这里插入图片描述
在这里插入图片描述

3.需要先求正规式再构造DFA

这种类型题,需要先把题目的描述用正规式表示出来,然后通过上面的步骤进行DFA的求解;

例题

在这里插入图片描述
这个符号串是由0和10构成的,所以它的正规式为:(0|10)*,然后这就是第一条的 通过正规式构造DFA,按照上述步骤解决即可;
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构入门——栈和队列详解

栈和队列详解1 栈1.1 栈的概念及结构1.2 栈的实现1.3 支持动态增长的栈1.3.1 结构声明1.3.2 栈的初始化和销毁1.3.3 入栈和出栈操作1.3.4 栈的判空和元素个数2 队列2.1 队列的概念及结构2.2 队列的实现2.3 链表实现队列2.3.1 结构声明2.3.2 队列的初始化和销毁2.3.3 队列入队和…

【工作流Activiti7】4、Activiti7 结束/终止流程

1. 结束/终止 正在运行的流程实例 思路:跟回退一样的思路一样,直接从当前节点跳到结束节点(EndEvent) /*** 结束任务* param taskId 当前任务ID*/ public void endTask(String taskId) {// 当前任务Task task taskService…

Tomcat学习

文章目录1、Tomcat是什么?2、Tomcat安装部署java环境部署tomcat目录结构介绍webapps目录bin目录tomcat启停方式3、Tomcat配置文件tomcat-users.xmlserver.xml结构组件详情配置文件注释4、Tomcat端口5、JVM调优6、Tomcat启动慢解决7、Tomcat面试题目1.Tomcat的默认端…

npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

一、问题描述 首次用vscode运行vue项目时,报错: npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 二、解决 我的解决过程:检查是否安装node.js环境 已安装node 这样一来,真不知道怎么回事了。环境也没有…

五、Arduino IDE开发esp8266环境搭建

1、安装驱动程序 (1)安装USB转串口驱动程序。 (2)根据板载的USB转串口驱动芯片选择合适驱动安装。USB转串口芯片负责和电脑之间进行数据通信。 (3)常见USB转串口驱动 CP210x驱动:CP210x USB 至 UART 桥 VCP 驱动器 - 芯科科技 CH340驱动 2、Arduino IDE环境搭建 要想使用Ar…

数据结构与算法java实战篇--高级排序

目录 一.希尔排序 二.划分 三.快速排序 1. 快速排序的算法 2.选择枢纽 一.希尔排序 希尔排序是基于插入排序的算法来实现的,不同的是希尔排序是采用n-增量来实现排序,如下是希尔排序的图解: 希尔排序会先以n个增量对元素进行划分&#xf…

原神私服 grasscutter搭建及食用教程 v3.3

本教程搭建过程食用vmware虚拟机服务端搭建过程及其简单。照着教程操作即可。本次对应的版本是3.3的版本,后期会持续更新。 一.资源下载准备: 1.vmwera16虚拟机下载安装自己百度吧,非常简单。一路next安装完后再输入一个百度来的秘钥即可。…

【kafka】学习笔记(二)

学习笔记五、Kafka Broker5.1、在zookeeper的服务端存储的Kafka相关信息5.2、Kafka Broker 总体工作流程5.3、Kafka Broker 节点服役和退役5.3.1、节点服役5.3.2、节点退役5.4、Kafka Broker 副本5.4.1、副本信息5.4.3、Leader 选举流程5.4.3、 Leader 和 Follower 故障处理细节…

【OpenCV-Python】教程:7-6 SVM识别手写字符

OpenCV Python SVM 识别手写字符 【目标】 用 SVM 识别手写字符 【代码】 在kNN中,直接用的是像素亮度值,这次,我们将使用 Histogram of Oriented Gradients (HOG) 作为特征向量 import cv2 import numpy as npSZ 20 bin_n 16 # Numbe…

Python pandas有几千个库函数,你用过几个?(5)

上一篇链接: Python pandas有几千个库函数,你用过几个?(4)_Hann Yang的博客-CSDN博客 12个pandas子模块又包含310个库函数(含类、方法、子模块): import pandas as pd funcs [_ …

【C与数据结构】——寒假提高每日练习Day1

一共16日的练习,分为选择题与编程题,涵盖了C语言所学以及数据结构的重点,以及一些秋招、春招面试的高频考点,难度会随着天数而上升。 (建议在电脑客户端进行,将鼠标选中被遮挡的地方,即可看到解…

aws codepipeline创建跨账户的cicd

参考资料 Building a Cross-account CI/CD Pipeline Create a pipeline in CodePipeline that uses resources from another AWS account 通常来说,我们会将代码和pipeline配置不同的账户中,在codepipeline的source阶段指定为另一个账号的codecommit仓…

将扩散模型应用到文本领域

前言 扩散模型在文生图领域可谓是大显身手,效果棒棒~ 每当一个idea有效之时,便会有更多相关的研究跟进尝试,今天就给大家介绍一篇将扩散模型应用到文本生成领域的工作,这也是一篇比较新的paper,其中还用到了…

LCS+LIS最长公共上升子序列

LIS LCS AcWing 272. 最长公共上升子序列 没优化的代码 优化解释在代码注释中优化解释在代码注释中优化解释在代码注释中 #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 3e3 10;int a[N], b[N], f[N][N];i…

开启浏览器sourcemap调试生产环境代码

开启浏览器sourcemap调试生产环境代码 Source Map介绍 在做网站性能优化的时候&#xff0c;我们经常会做js和css代码压缩。但是压缩之 后的代码在调试的时候就会异常困难。source map就是解决问题的一种解决方案 浏览器Source Map 浏览器可以设置开启或者关闭SourceMap&…

78. 子集

78. 子集 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2]…

14【SpringMVC的拦截器】

文章目录一、拦截器1.1 拦截器与过滤器1.2 拦截器的应用1.2.1 HandlerInterceptor接口1.2.2 拦截器的拦截规则1.3 搭建工程测试拦截器1.3.1 测试SpringMVC拦截器1.3.2 SprinMVC拦截器注意事项1.4 HandlerMethod类1.5 多个拦截器的执行顺序一、拦截器 1.1 拦截器与过滤器 过滤…

第6章 el-menu刷新保持当前菜单选项与角色页面

1重构&#xff1a;src\components\AdminLayoutComponen.vue(el-menu刷新保持当前菜单选项) <template> <el-container> <!-- 侧边栏 &#xff0c;"<div class"aside">标签可被删除&#xff0c;为了下拉条控件样式保存了该标签"-->…

maven的插件(命令)install介绍

maven的插件&#xff08;命令&#xff09;install介绍背景关于构建时使用的maven命令installmaven其他插件/命令的使用背景 今天在引入SpringCloudAlibaba时&#xff0c;pom.xml中的dependency报错了 到本地仓库去验证 验证无误&#xff0c;找原因 现象&#xff1a; 在maven…

Flink-状态编程(按键分区状态、算子状态、广播状态、持久化与状态后端)

9 状态编程 9.1 概述 9.1.1 状态 所谓的状态&#xff0c;最常见的就是之前到达的数据&#xff0c;或者由之前数据计算出的某个结果 继承富函数类的函数类就可以获取运行时上下文&#xff0c;也就可以自定义状态&#xff0c;例如process中的ProcessFunction&#xff0c;CoPr…