由正规表达式构造DFA,以及DFA的相关化简

目录

1.由正规式到DFA

首先讲如何从正规式到NFA

如何从NFA到DFA

2.DFA的化简

3.DFA和NFA的区别 


1.由正规式到DFA

正规式--->NFA---->DFA

首先讲如何从正规式到NFA

转换规则:

例题1:这里圆圈里面的命名是随意的,只要能区别开就可以了

如何从NFA到DFA

NFA---->状态转换表---->状态转换矩阵---->DFA

如下例题:

以上NFA的转换表如下图所示:

这里的"I"是从x出发的状态,"Ia"表示I集合中的字符经过a的状态的集合

规则:若经过的是\varepsilon(空串),那么就经过空串后到达的字符加入到集合中,如果没有经过\varepsilon空串,就不到达。

这里的每一列就是列举上一行中出现的集合,例如第二列,列举的就是上一行中出现的红框的集合

就拿I={1,2,3}具体说:

由图,1经过a的状态有:1,2经过a的状态有3,3经过a的状态有5,6,Y(因为5后面接的就是\varepsilon串),所以I_{a}={1,2,3,5,6,Y}

以此类推就能得到转换表,再将相同的集合表示出来

就可以进一步得到转换矩阵

再根据状态转换矩阵可得图DFA

注:这个图怎么判断这个状态是不是一个终态(一个圈还是两个圈),那么我们只需要看状态转换表

表中含有Y的集合,就是终态,需要画两个圈

2.DFA的化简

这里终态和非终态的状态分别为终态={3,4,5,6},非终态={0,1,2}

对于非终态{0,1,2}:

将{0,1,2}分别输入a,即{0,1,2}a,通过状态转换矩阵可知,{0,1,2}a={1,3},{1,3}对于{0,1,2}而言,不是包含关系,所以

将得到1的状态和得到3的状态分开:

{0,2}-->{1},{1}--->{3}

再对{0,2}输入b的状态:

{0,2}b--->{2,4},{2,4}不包含在{0,2}中,所以{0}--->{2},{2}---->{4}

 对于终态{3,4,5,6}:

{3,4,5,6}a={3,6},包含关系

{3,4,5,6}b={4,5},包含关系

对于非终态有{0}{1}{2}状态,对于终态有{3,4,5,6}状态,将他视为状态{3},那么

这里还是根据状态转换矩阵画,只是看到{3,4,5,6}都指向状态{3}

3.DFA和NFA的区别 

NFA是不确定的有穷自动机,DFA是确定的有穷自动机

DFA与NFA的区别在于,NFA的状态转换过程中可以有空串,如下图即为NFA:

这就导致了一个问题:开始之后,在给出字符a或b之前,我们能够确定当前是处于1状态还是2状态吗?很显然,我们是无法确定的,因此才被称为不确定的有穷自动机,因为空串的存在,我们无法确定当前的具体状态是什么。

所以NFA的不确定表现我们可以概括为:1.多值映射        2.带空转移

所以我们要将NFA转换为DFA

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs微信小程序+python+PHP计算机网络在线考试系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

Apache RocketMQ,构建云原生统一消息引擎

本文整理于 2023 年云栖大会林清山带来的主题演讲《Apache RocketMQ 云原生统一消息引擎》 演讲嘉宾: 林清山(花名:隆基),Apache RocketMQ 联合创始人,阿里云资深技术专家,阿里云消息产品线负…

【RabbitMQ】RabbitMQ详解(二)

RabbitMQ详解 死信队列死信来源消息TTL过期队列达到最大长度消息被拒绝 RabbitMQ延迟队列TTL的两种设置队列设置TTL消息设置TTL 整合SrpingBoot队列TTL延时队列TTL优化Rabbtimq插件实现延迟队列 死信队列 先从概念解释上搞清楚这个定义,死信,顾名思义就…

异常处理和单元测试python

一、实验题目 异常处理和单元测试 二、实验目的 了解异常的基本概念和常用异常类。掌握异常处理的格式、处理方法。掌握断言语句的作用和使用方法。了解单元测试的基本概念和作用。掌握在Python中使用测试模块进行单元测试的方法和步骤。 三、实验内容 编程实现如下功能&a…

Linux学习笔记8-Uboot移植-网络设置和其他坑的解决

Linux之所以被称为操作系统,肯定是需要有引导程序来启动各个关键外设的运行,这里可以和个人电脑PC做个类比。我们在开机的时候是不是先要进入BIOS,BIOS在初始化硬盘、内存、USB接口、网口等之后,才可以进入Windows系统对吧&#x…

直接插入排序【从0-1学数据结构】

文章目录 💗 直接插入排序Java代码C代码JavaScript代码稳定性时间复杂度空间复杂度 我们先来学习 直接插入排序, 直接排序算是所有排序中最简单的了,代码也非常好实现,尽管直接插入排序很简单,但是我们依旧不可以上来就直接写代码,一定要分析之后才开始写,这样可以提…

HarmonyOS4.0从零开始的开发教程21HarmonyOS云开发简介

HarmonyOS(十九)HarmonyOS云开发简介 概述 HarmonyOS云开发是DevEco Studio新推出的功能,可以让您在一个项目工程中,使用一种语言完成端侧和云侧功能的开发。 基于AppGallery Connect Serverless构建的云侧能力,让您…

【并发设计模式】聊聊两阶段终止模式如何优雅终止线程

在软件设计中,抽象出了23种设计模式,用以解决对象的创建、组合、使用三种场景。在并发编程中,针对线程的操作,也抽象出对应的并发设计模式。 两阶段终止模式- 优雅停止线程避免共享的设计模式- 只读、Copy-on-write、Thread-Spec…

YOLOv5算法改进(23)— 更换主干网络GhostNet + 添加CA注意力机制 + 引入GhostConv

前言:Hello大家好,我是小哥谈。本节课就让我们结合论文来对YOLOv5进行组合改进(更换主干网络GhostNet + 添加CA注意力机制 + 引入GhostConv),希望同学们学完本节课可以有所启迪,并且后期可以自行进行YOLOv5算法的改进!🌈 前期回顾: YOLOv5算法改进(1)— 如何去…

(一)深入理解Mysql底层数据结构和算法

什么是索引 索引是帮助MySQL高效获取数据的排好序的数据结构 数据结构有哪些 数据结构模拟网站:Data Structure Visualization 二叉树 不适合做自增ID的数据结构。如下示意图,假设采用二叉树作为表自增主键ID的数据存储结果如下:当查询i…

Flink 数据序列化

为 Flink 量身定制的序列化框架 大家都知道现在大数据生态非常火,大多数技术组件都是运行在JVM上的,Flink也是运行在JVM上,基于JVM的数据分析引擎都需要将大量的数据存储在内存中,这就不得不面临JVM的一些问题,比如Ja…

Flink实时电商数仓(五)

FlinkSQL的join Regular join普通join,两条流的数据都时存放在内存的状态中,如果两条流数据都很大,对内存压力很大。Interval Join: 适合两条流到达时间有先后关系的;一条流的存活时间短,一条流的存活时间长。Lookup …