从正则表达式到NFA

news2024/9/22 3:53:45

一、正则表达式到NFA的基本结构

1. 我们先回顾一下 RE 的三个基本操作:

  • 可选(alternative):对于给定的两个正则表达式 M 和 N,选择操作符( | )形成一个新的正则表达式 M|N ,如果一个字符串属于 M 或者 N,则它属于 M|N。
  • 联结(concatenation):对于两个对于给定了两个正则表达式 M 和 N,连接操作符( · )形成一个新的正则表达式 M·N,通常可以省略连接符号,比如 (a|b)·a ,定义了两个字符串:aa、ab。
  • 克林闭包(Kleene closure): 正则表达式 M 的克林闭包,记作 M*,定义为 M 与自身连接 0 次或者多次形成的所有集合取并集。

2. RE 到 NFA

由于 NFA 是 RE 的实现形式,本身是等价,我们先看看三个基本操作对应的 NFA ,这里我们介绍一下 Thompson 构造法:

这个构造法包含三个基本操作以及单个字符对应的 NFA:

  • a 对应的 NFA
    在这里插入图片描述

  • b 对应的 NFA
    在这里插入图片描述

  • ab 对应的 NFA
    在这里插入图片描述

  • a|b 对应的NFA
    在这里插入图片描述

  • a* 对应的 NFA
    在这里插入图片描述

注:带有双环的状态属于接受状态

这个构造发就是从输入的 RE 每一个字符构造简单的 NFA 开始,然后按照优先级规定的顺序,根据基本操作转换的。

这种构造法实现起来比较简单,每个NFA 都有一个 S(0) 和一个 S(A),没有从 S(A) 发出的转移,连接其他 NFA 的时候总是使用 ϵ 转移来链接前一个 NFA 的 S(A)和后一个 NFA 的起始状态。最后,每个状态至多有两个进入或者退出该状态的 ϵ 转移。对于字母表中的每个符号,至多有一个进入该状态和退出该状态的转移。这些性质简化了 NFA 的表示以及操作

3. 举例介绍

我们根据 Thompson 构造法,分步骤构造一下 a(b|c)* 这个正则表达式的转化过程

  1. 对字母表中的 a、b、c 构造对应单个字符对应的 NFA
    在这里插入图片描述

  2. 构造出 b|c 对应 的 NFA
    在这里插入图片描述

  3. 构造出 (b|c)* 对应的 NFA,对 *1 这个 NFA,执行克林闭包的基本操作:
    在这里插入图片描述

  4. 在 2 式前面进行连接 a 的基本操作,完成最终的转化, 2 式代表(b|c) 的 NFA
    在这里插入图片描述

  5. 其实上面的例子可以看到 NFA 存在大量的不必要的状态以及 ϵ 转移,这些都可以通过一些 NFA 转化为 DFA 的构造方法,比如子集构造法,将这些无效的状态转移移除,最终形成的 DFA 如下:

在这里插入图片描述

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

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

相关文章

28.Isaac教程--使用Sight的远程操纵杆

使用Sight的远程操纵杆 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录使用Sight的远程操纵杆设置 Isaac 应用程序以使用虚拟游戏手柄小部件关于虚拟游戏手柄小部件使用虚拟游戏手柄小部件运作模式手柄模式鼠标模式键盘模式控制机器人运…

设计模式_行为型模式 -《责任链模式》

设计模式_行为型模式 -《责任链模式》 笔记整理自 黑马程序员Java设计模式详解, 23种Java设计模式(图解框架源码分析实战) 概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象…

windows最小化安装mysql8

第一步:下载 从官网下载,https://dev.mysql.com/downloads/mysql 第二步:安装 下载后解压到目录即可。 我这里解压到D:\MYSQL\mysql-8.0.32-winx64\mysql-8.0.32-winx64 第三步:初始化配置 1、添加系统变量 在系统变量PATH后…

【C++】从0到1入门C++编程学习笔记 - 基础入门篇:数组

文章目录一、概述二、一维数组2.1 一维数组定义方式2.2 一维数组数组名2.3 C 实现冒泡排序三、二维数组3.1 二维数组定义方式3.2 二维数组数组名3.3 二维数组应用案例一、概述 所谓数组,就是一个集合,里面存放了相同类型的数据元素 特点1:数…

(15)go-micro微服务main.go开发

文章目录一 导包二 配置中心三 注册中心四 zap日志初始化五 初始化Mysql数据库六 初始化Redis连接七 注册服务八 初始化服务九 注册 handle十 启动服务十一 main.go全部代码十二 最后一 导包 import (micro2 "account/common/micro""account/config/logger&quo…

day17|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。 示例 1: 输入:root [4,2,6,1,3] 输出:1 示例 2&#xff1…

Redis持久化——AOF机制详解

在运行情况下,Redis 以数据结构的形式将数据维持在内存中,为了让这些数据在 Redis 重启之后仍然可用,需要将数据写入持久存储 持久化是指将数据写入持久存储,例如固态磁盘(SSD) Redis 提供了一系列持久化选项。这些包括&#xff1…

[GYCTF2020]Blacklist(堆叠注入)

目录 信息收集 堆叠注入 payload 总结 信息收集 观察url变化是get请求的SQL注入题目 判断注入类型 1和1"回显一样 1回显报错 1 or 11# array(2) {[0]>string(1) "1"[1]>string(7) "hahahah" }array(2) {[0]>string(1) "2"[…

【C语言进阶】最常用的库函数大全——从入门到精通

目录 一.字符串函数 1.strlen——求字符串长度 2.长度不受限制的字符串函数 a.strcpy——字符串拷贝 b.strcat——追加字符串 c.strcmp——字符串比较 3.长度受限制的字符串函数——strncpy,strncat,strncmp 4.字符串查找 a.strstr——判断是否为子字符串 b.strtok—…

Java网络编程(2)

关于网络编程上一章内容,可以参考: https://blog.csdn.net/Raine_Yang/article/details/128697335?spm1001.2014.3001.5501 使用服务器处理多个客户端 一般来说,同一服务器要持续运行处理多个客户端的请求。我们可以为每一个客户端请求分配…

@Scope 用法

参考:Scope注解 详细讲解及示例 官方文档 When used as a type-level annotation in conjunction with Component, Scope indicates the name of a scope to use for instances of the annotated type. When used as a method-level annotation in conjunction w…

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(示波器)】

目录 序言 🍍放置虚拟仪器仪表 🍉示波器 🍊🍊1.“时基”选项组 (1)标度 (2)X轴位移 (3)显示方式选择 🍊🍊2.“通道”选项组 …

函数指针与回调函数详解

目录1.函数指针2.函数指针数组3.指向函数指针数组的指针4.回调函数1.函数指针 前面我们学的: 整形指针是指向整形的指针字符指针是指向字符的指针数组指针是指向数组的指针 所以函数指针就是指向函数的指针 假如有一个int类型变量a,要取它的地址就是…

【Linux】Linux软件包管理器与Linux编辑器

文章目录🎪 Linux软件包管理器🚀 1.yum基本介绍🚀 2.yum基本命令🚀 3.关于rzsz工具的安装与使用⭐3.1 rzsz工具介绍⭐3.2 rzsz工具安装⭐3.3 rzsz工具使用🎪 Linux编辑器🚀 1.vim常用三种模式🚀…

事务管理-spring

什么是事务 - 事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行。 • 事务的特性(ACID) - 原子性(Atomicity):事务是应用中不可再分的最小执行体。 - 一致…

MySQL使用索引的最佳指南

MySQL使用索引的最佳指南1.选择合适的字段创建索引2.尽可能的考虑建立联合索引而不是单列索引3.注意避免冗余索引4.考虑在字符串类型的字段上使用前缀索引代替普通索引5.索引失效的情况1.选择合适的字段创建索引 不为 NULL 的字段 :索引字段的数据应该尽量不为 NUL…

java面向对象,全是对象,这么多对象2023015

面向对象(一遍一遍的领悟) Java支持面向对象的三大特征:封装、继承和多态, Java提供 了private、protected和public三个访问控制修饰符来实现良好的封装,提供了extends关键字来让子类继承父类,子类继承父类…

人工智能图像形状检测算法

博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的&#xff0c…

Redis下载安装与配置(linux)

一、Redis下载与安装 1.下载安装包 官网下载地址:Download | Redis 点击"Download 7.0.7",即可进行下载。 2.将安装包上传至服务器 2.1将安装包上传至/usr/local目录并解压 cd /usr/local lstar -zxvf redis-7.0.7.tar.gz2.2删除安装包 r…

第二天总结 之 商品类型管理界面的实现 之 添加和修改操作 的实现

添加和修改操作 页面跳转问题 点击修改按钮时 跳转的路径 如下 点击添加按钮时 跳转的路径如下 通过这两张图片 不难发现 跳转的是同一个jsp 但是添加操作 是不带id跳转 而修改操作是带着id跳转 所以在其 跳转的页面add_goods_type.jsp页面中 有一个这样的判断 如果没有id…