字符串匹配 - Overview

news2024/11/19 3:18:50
字符串匹配(String Matchiing)也称字符串搜索(String Searching)是字符串算法中重要的一种,是指从一个大字符串或文本中找到模式串出现的位置。

字符串匹配概念

字符串匹配问题的形式定义:
  • 文本(Text)是一个长度为 n 的数组 T[1..n];

  • 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m];

  • T 和 P 中的元素都属于有限的字母表 Σ 表;

  • 如果 0≤s≤n-m,并且 T[s+1..s+m] = P[1..m],即对 1≤j≤m,有 T[s+j] = P[j],则说模式 P 在文本 T 中出现且位移为 s,且称 s 是一个有效位移(Valid Shift)。

比如上图中,目标是找出所有在文本 T = abcabaabcabac 中模式 P = abaa 的所有出现。该模式在此文本中仅出现一次,即在位移 s = 3 处,位移 s = 3 是有效位移。

字符串匹配算法通常分为两个步骤:预处理(Preprocessing)和匹配(Matching)。所以算法的总运行时间为预处理和匹配的时间的总和。

上图描述了常见字符串匹配算法的预处理和匹配时间。

字符串匹配算法

解决字符串匹配的算法包括:朴素算法(Naive Algorithm) 即暴力破解、Rabin-Karp 算法、有限自动机算法(Finite Automation)、 Knuth-Morris-Pratt 算法(即 KMP Algorithm)、Boyer-Moore 算法、Simon 算法、Colussi 算法、Galil-Giancarlo 算法、Apostolico-Crochemore 算法、Horspool 算法和 Sunday 算法等。
  • 朴素的字符串匹配算法(Naive String Matching Algorithm)

  • 朴素的字符串匹配算法又称为暴力匹配算法(Brute Force Algorithm),最为简单的字符串匹配算法

  • Knuth-Morris-Pratt 字符串匹配算法(即 KMP 算法)

  • Knuth-Morris-Pratt算法(简称KMP)是最常用的字符串匹配算法之一

  • Boyer-Moore 字符串匹配算法

  • 各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法,效率非常高

  • 字符串匹配 - 文本预处理:后缀树(Suffix Tree)

  • 上述字符串匹配算法(朴素的字符串匹配算法, KMP 算法, Boyer-Moore算法)均是通过对模式(Pattern)字符串进行预处理的方式来加快搜索速度。对 Pattern 进行预处理的最优复杂度为 O(m),其中 m 为 Pattern 字符串的长度。那么,有没有对文本(Text)进行预处理的算法呢?本文即将介绍一种对 Text 进行预处理的字符串匹配算法:后缀树(Suffix Tree)

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

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

相关文章

Nodejs的安装

1. Nodejs的真正用途 a. 一个javascirpt的运行环境 b. 运行在服务器,作为web server c. 运行在本地,作为打包,构建工具 2. Nodejs的下载和安装 a. 普通方式(访问官网) 下载对应系统版本即可(个人学习可无需…

【数据结构与算法分析】介绍蛮力法以及相关程序案例

文章目录蛮力法之排序选择排序冒泡排序实际应用蛮力法之最近对和凸包问题最近对问题凸包问题蛮力法(brute force),其本质跟咱常说的暴力法是一样的,都是一种简单直接地解决问题的方法,通常直接基于问题的描述和所涉及的概念定义进行求解。 蛮…

【嵌入式】HC32F460串口接收超时中断+DMA

一 项目背景 项目需要使用一款UART串口编码器,编码器的数据以波特率57600持续向外发送。但这组数据包没有固定的包头和校验尾,仅仅是由多圈圈数和单圈角度组成的六字节数据码,这样接收到的数组无法确定实际的下标,所以这边考虑用串…

8月起,《PMBOK®指南(第七版)》将被采用,考PMP的注意了!

PMP第七版教材采用时间定了!!!2023年【8月开始】第一次使用第七版教材,通知明显指出,第六版的关键知识任然还是有效的。第七版做的调整还是蛮大的,首次提出了项目管理的 12 项原则和8个项目绩效域&#xff…

Java基础语法小结来啦

简单的来说,一个java的程序他是有一系列对象的集合组成,通过对这些对象相互间调用的方式协同工作,下面就是我有关于Java基础语法的一些小结。 一、return简单使用 下面来一个Java程序,表示的是在self1这个包中我们创建了一个名叫…

Skywalking ui页面功能介绍

菜单栏 仪表盘:查看被监控服务的运行状态; 拓扑图:以拓扑图的方式展现服务之间的关系,并以此为入口查看相关信息; 追踪:以接口列表的方式展现,追踪接口内部调用过程; 性能剖析&am…

GEE学习笔记 八十:批量下载影像

最近问如何批量导出集合的小伙伴非常多,一个一个回复太麻烦,我这里直接给一段例子代码吧: var l8 ee.ImageCollection("LANDSAT/LC08/C01/T1_SR"); var roi /* color: #d63000 */ee.Geometry.Polygon( [[[115.64960937…

从0到1一步一步玩转openEuler--17 openEuler DNF(YUM)检查更新

文章目录17.1 检查更新17.2 升级17.3 更新所有的包和它们的依赖DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查询软件包信息,从指定软件库获取软件包,自动处理依赖关系以安装或卸载软件包,以及更新系统到最新可用版本…

Nacos框架服务注册发现和配置中心原理

文章目录1.简介2.整体架构和原理2.1 服务发现注册原理2.1.1 注册和拉取数据2.1.2 Server集群一致性2.1.3 健康检查2.2 配置中心原理2.2.1 支持功能和资源模型2.2.2 server集群数据一致性问题2.2.3 client和server的通信监听改动方式2.2.4 client拉取数据2.2.5 client请求server…

kubernetes教程 --Pod生命周期

Pod生命周期 pod创建过程运行初始化容器(init container)过程运行主容器(main container)过程 容器启动后钩子(post start)、容器终止前钩子(pre stop)容器的存活性探测(…

利用设计模式、反射写代码

软件工程师和码农最大的区别就是平时写代码时习惯问题,码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码。 业务同学抱怨业务开发没有技术含量,用不到设计模式、Java 高级特性、OOP,平时写代码都在堆 CRUD,个…

网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)

在K8s平台部署项目流程 在K8s平台部署Java网站项目 制作镜像流程 第一步:制作镜像 使用镜像仓库(私有仓库、公共仓库): 1、配置可信任(如果仓库是HTTPS访问不用配置) # vi /etc/docker/daemon.json { "…

matlab 简单的水轮机系统的模糊pid控制仿真

1、内容简介略641-可以交流、咨询、答疑2、内容说明模糊介绍:Matlab4.2以后的版本中推出的模糊工具箱(Fuzzy Toolbox),为仿真模糊控制系统提供了很大的方便。 在Simulink环境下对PID控制系统进行建模是非常方便的,而模糊控制系统与PID控制系统…

DataFrame 循环处理效率的记录

几种工具的处理效率比较: 每次循环都使用复杂的操作尽可能拆分成向量化操作,也可转为numpy,再用numba加速。 对 DataFrame 中的数据做循环处理的效率: 方法一:下标循环 for i in range(len(df)): if df.iloc[i][…

GEE学习笔记 七十七:GEE学习方法简介

这是一篇关于学习方法的思考探索,当然我不会大篇文章介绍什么学习方法(因为我也不是这方面的专家?),这个只是总结一下我是如何学习GEE以及在学习中遇到问题时如何解决问题的。我写这篇文章的目的就是在和一些学习GEE的新同学接触…

Stable diffusion扩散模型相关原理

时隔两年半(2年4个月),我又回来研究生成技术了。以前学习研究GAN没结果,不管是技术上,还是应用产品上,结果就放弃了,现在基于diffusion的技术又把生成技术带上了一个新的高度。现在自己又来研究…

一款好的低代码开发平台应该是什么样?

一款好的低代码开发平台应该是什么样? 以企业级应用构建来讲,完成一个应用复杂度随着技术的进步、需求的细化、业务要求的变化并不是逐渐降低,而是逐渐提升。用户想要有更好的体验,复杂度更是成倍提升。 基于此,低代码…

【机器学习】Sklearn 集成学习-投票分类器(VoteClassifier)

前言 在【机器学习】集成学习基础概念介绍中有提到过,集成学习的结合策略包括: 平均法、投票法和学习法。sklearn.ensemble库中的包含投票分类器(Voting Classifier) 和投票回归器(Voting Regressor),分别对回归任务和分类任务的…

比Teambition、Worktile 更适合研发团队的几大工具盘点

Worktile 和 Teambitiom 哪个更好?两个产品各有特点。1.Teambition 优势:操作简单、个人版永不收费、更适合小型团队;2.Teambition 劣势:无法满足中大型团队复杂的项目管理、自定义能力弱、无法与钉钉以外的工具打通等&#xff1b…

再次遇到RuntimeError: CUDA error: an illegal memory access was encountered

之前遇到过一次记录下来了,第一次遇到 翻看之前的记录,首先想着如何让pycharm准确地显示错误。 1:os.environ[‘CUDA_LAUNCH_BLOCKING’] 1’,模型前加这句,但是我在train文件中已经加了,还是不清楚报错原因。 2:使用…