有限自动机字符串匹配

news2025/7/12 7:33:16

上一篇文章正则表达式,提到正则表达式是一种用来表示有限自动机所接受单词组合的语言,那么什么是有限自动机呢,以及它是如何进行字符串匹配的,下面来做详细介绍

什么是有限自动机

目前程序上利用不同的编程语言通过正则表达式进行字符串匹配,其底层是由有限自动机(Finite Automaton)来实现的,有限自动机简称 FA。FA 是一个有限状态的集合,还有一些从一个状态通向另一个状态的边,每条边上有一个符号,期中一个状态是初态,某些状态是终态,是一种状态转移图。形式上,FA 是一个五元组(S、Σ、δ(s, c)、S(0)、S(A)),其中各个分量表示如下:

S:是 FA 中的有限状态集合,包含错误状态 S(E),通常 S(E) = S(0)。
Σ:是 FA 中的使用的字母表,通常 Σ 是转移图种边的标签集合。
δ(s, c):是 FA 的状态转移函数。它将每个状态 s 和每个字符 c的组合(s, c)映射到下一个状态。在状态 S(i) 遇到输入字符 c,FA 将进行状态转移。
S(0):是指定的起始状态,属于 S 的子集。
S(A):是接受状态集合,属于 S 的子集。

下面是一个简单的 FA 示意图,表示的是一个以 a 开头,中间可以有 n 个连续的 c , 或者 n 个连续的 ba 组成的字符串,比如 a、aba、abababa、accccba、acccbababa、ababacccbacc 等,正则表达式可以表示为 a((ba)c)*
在这里插入图片描述

字符串匹配过程

有限自动机开始于状态 S(0) ,每次读入字符串中的一个字符 c,状态就会通过 δ(s, c) 进行一次状态转移,每当当前达到的状态 s 属于 S(A) 时,就说自动机 FA 接受了迄今为止所读入的字符串,同时达到 S(A) 时主串(Text)的下标就是匹配完成的结束位置。如果没有被接受的输入则匹配失败。有限自动机字符串匹配主要分为两步:构造字符串匹配自动机、进行主串匹配。

1. 字符串匹配自动机

字符串匹配自动机是针对模式串 P 来构建的,类似于 KMP 算法构造 Next 数组。

假设模式串 P 的长度为 m,则有限自动机对应的分量分别设定为:

状态集合 S = {0, 1, 2, …, m-1, m}
字母表 Σ 为 P 包含的所有字符集合
起始状态 S(0) = 0
接受状态 S(A) = {m}
状态转移函数 δ(s, c) 下面会详细介绍

为了定义状态转移函数 δ(s, c) ,我们先引入一个后缀函数 φ(t),φ(t) 是一个从输入文本(Σ* )到状态集合(S)的映射,φ(t) 表示 t 的后缀同时是 P 前缀的情况下,t 后缀的最长长度。并且认为空字符串 ϵ 是任意字符串的后缀,所以后缀函数是良定义(well-defined)的。
例如:设定模式串 P = ab,则

φ(ϵ) = 0,
φ(a) = 1,t = a 的后缀在模式串 P = ab 的最长前缀是 a,长度为 1
φ(ca) = 1,t = ca 的后缀在模式串 P = ab 的最长前缀是 a,长度为 1
φ(cc) = 0,t = ca 的后缀在模式串 P = ab 的最长前缀是 ϵ,长度为 0
φ(cab) = 2,t = cab 的后缀在模式串 P = ab 的最长前缀是 ab,长度为 2
φ(cabc) = 0,t = cabc 的后缀在模式串 P = ab 的最长前缀是 ϵ,长度为 0

在引入后缀函数 φ(t) 的基础下,对于任意的状态 s 和字符 c,状态转移函数 δ(s, c) 的定义为

δ(s, c) = φ(P(s)c)

  • P(s) 表示模式串 P 在状态 s 时的前缀
  • P(s)c 表示在 P(s) 后拼接字符 c。

2. 字符串匹配

下面我们通过一个例子来说明对应的状态转移图是什么样子,状态是怎么转移的,以及如何与主串进行匹配:

例:
模式串 P = ababcab

构建状态转移图如下:

  • 它可以接受所有以 P 结尾的字符串,初始状态 S(0) = 0,接受状态 S(A) = {7};
  • 向右的边表示匹配模式串 P 与主串输入字符匹配成功;
  • 向左的边表示匹配失败后对于模式串的回溯;
  • 直接匹配失败回溯到初始状态 S(0) 的边并没有画出来
    在这里插入图片描述

下表表示转移函数 δ(s, c) 和模式串 P 的对应关系
在「状态」s 的基础上输入 a、b、c 会到达对应表格种的状态,以及匹配成功后对应模式串中的字符:

状态 >输入 a输入 b输入c> P
0100a
1120b
2300a
3140b
4305c
5600a
6170b
7300NA

匹配过程

设定
主串 T = abababcabac
主串 T 字符下标从 1 开始,经过 φ(P(s)c) 在主串的位置 9 找到一个模式串 P 的完全匹配
结果:成功匹配,匹配位置以 9 结尾

index-1234567891011
T-abababcabac
φ(P(s)c)012343456730

代码实现以及复杂度分析

1. 状态转移函数

2. 匹配函数

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

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

相关文章

泰勒公式理解

文章目录1:一元泰勒展开公式2:二元泰勒展开公式3:二元函数的黑塞矩阵4:多元函数的黑塞矩阵其他链接1:一元泰勒展开公式 举例:f(x) 3x 2x 5 在x0或x1处的泰勒展开 当x0时: 当x1时&#xff…

cadence orcad capture tcl/tk脚本开发

Orcad是一个很优秀的原理图工具,orcad支持tcl/tk开发,介绍一下当前本人开发的脚本工具,可用于提高硬件工程师的画图效率。 环境准备 将压缩包解压到C盘(注意一定要C盘根目录下),C:\Tcltk。如下图所示将上图…

Selector的使用

文章目录Selector 的使用1.直接使用2. Scrapy Shell3.XPath 选择器4.CSS选择器5.正则匹配Selector 的使用 我们之前介绍了利用Beautiful Soup、pyquery 以及正则表达式来提取网页数据的方法,确实非常方便。不过Scrapy提供了自己的数据提取方法,即内置的…

[附源码]java毕业设计社区志愿者服务系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

传输中的差错检验技术

差错检验 在网络传输过程数据难免会产生错误,需要使用差错检验技术进行纠错,可靠传输技术避免错误的发生 1 术语 比特差错 误码率BER 差错检验码 2 奇偶校验(不会采用) 在待发送的数据后面添加1位奇偶校验位,使整…

MyBatis基于XML的详细使用-参数、返回结果 处理

1、参数的取值方式 在xml文件中编写sql语句的时候有两种取值的方式,分别是#{}和${}。 注意:这里推荐使用#{}的方式,可以有效的防止sql注入问题。 2、select的参数传递 1.单个参数: 不管多少个参数最好在参数前加上param注解,为其取一个别名 2.多个参数…

[网络工程师]-传输层协议-TCP拥塞控制

TCP拥塞控制的概念是:每个源端判断当前网络中有多少可用容量,从而知道它可以安全完成传送的分组数。拥塞控制解释防止过多的数据注入网络,避免网络中间设备(路由器、交换机等)过载而发生拥塞。拥塞控制是一个全局性的过…

数据结构系列学习(九) - 循环队列(Circular_Queue)

目录 引言: 学习: 循环队列设计背景: 利用顺序表的思维对队列进行探讨: 解决方案的思考: 循环队列中循环的体现: 循环队列的要点: 第一个难点: 第二个难点: 第三…

Verilog 显示任务($display, $write, $strobe, $monitor)

Verilog 中主要用以下 4 种系统任务来显示(打印)调试信息:$display, $write, $strobe, $monitor。 $display $display 使用方法和 C 语言中的 printf 函数非常类似,可以直接打印字符串,也可以在字符串中指定变量的格…

7. 微服务之Docker自动化部署

7.1 Docker 介绍 Docker 是一个快速交付应用、运行应用的技术: 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器,各个应用互不干扰启动、移除都可以通过一行命令完成&#xff…

华清远见:驱动点灯第N回目

1.在串口工具进行输入: echo 1 > /dev/myled0 ---->led1灯点亮 echo 0 > /dev/myled0 ---->led1灯熄灭 echo 1 > /dev/myled1 ---->led1灯点亮 echo 0 > /dev/myled1 ---->led1灯熄灭 echo 1 > /dev/myled2 ---->led1灯点亮 ec…

力扣刷题day52|84. 柱状图中最大的矩形

文章目录84. 柱状图中最大的矩形思路动态规划单调栈84. 柱状图中最大的矩形 力扣题目链接 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: …

空间域图像增强处理-含Labview程序

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、领域图像增强实例分析✳️ 2.1 线性滤波实例分析✳️ 2.2 非线性滤波实例分析✳️ 2.3 Canny边缘检测✳️ 三、Labview程序获取✳️ 一、引言 图像在其采集或传递过程中常会受到各种噪声的影响,这会导致其中包含的重要信息很…

忘机工尺谱 - 快速打谱软件

引言 为了实现高效快速打谱,我实现了一种词谱分离的输入方案,解决了当前工尺谱平台打谱过程频繁切换输入法和频繁点击鼠标等问题,大大提高了打谱效率。同时借鉴了Markdown编辑器”所见即所得“的思想,输入的同时可以见到排版后的…

java线程控制

java线程控制的语法很多 这里我们主要说以下三个方法 我们先新建一个包 包下建立两个类 customException 线程类 参考代码如下 public class customException extends Thread {public String name;public customException(){}public void run(){for(int i 0;i < 100;i)…

逆变器电力计量仪表可安装在分布式光伏运维云平台、光伏变电站

安科瑞 李可欣 1、概述 AcrelCloud-1200分布式光伏运维云平台通过监测光伏站点的逆变器设备&#xff0c;气象设备以及摄像头设备、帮助用户管理分散在各地的光伏站点。主要功能包括&#xff1a;站点监测&#xff0c;逆变器监测&#xff0c;发电统计&#xff0c;逆变器一次图&…

解决找不到依赖项的问题(根源直接解决)

&#xff08;文章最后&#xff0c;我会介绍一个万能解决方法&#xff09; 问题&#xff1a; 原因&#xff1a; &#xff08;1&#xff09;可能是你的本地仓库里没有该依赖项。 &#xff08;2&#xff09;如果有的话&#xff0c;可能是没有更新同步到idea 解决方法&#xff1…

基于Springboot+mybatis+mysql+html教育培训中心教学系统

基于Springbootmybatismysqlhtml教育培训中心教学系统一、系统介绍二、功能展示1.用户登陆2.用户注册3.个人中心4.人员信息管理5.课程管理6.缴费管理7.学生考勤管理8.器材管理9.问题管理&#xff08;学生、老师&#xff09;一、系统介绍 系统主要功能&#xff1a; 管理员&…

第五届“传智杯”全国大学生计算机大赛(练习赛)[传智杯 #5 练习赛] 时钟

[传智杯 #5 练习赛] 时钟 题目描述 你有一个电子钟&#xff0c;可以显示 0:00 到 23:59 之间的所有时间&#xff0c;以数字的形式显示。其中小时是 0 到 23&#xff08;0 时会显示一个 0&#xff0c;而 1 到 9 时不会显示前导 0&#xff09;&#xff0c;分钟是 00 到 59&…

矩阵分析与计算学习记录-矩阵函数

本章重点内容&#xff1a; 矩阵函数的定义和计算 矩阵函数的导数和积分&#xff1a;导数定义和性质、对矩阵变量的导数、矩阵函数的积分及其性质 利用矩阵函数求解线性常系数微分方程&#xff1a;一阶线性常系数微分方程、n阶线性常系数微分方程 1. 矩阵函数的定义和计算 1…