【算法】字符串匹配1 BF算法 RK算法

子字符串查找算法(BF、KMP、BM、RK) 子字符串查找算法,包括暴力算法、KMP的自动机实现和next实现、BM、RP的总结 阅读详情

字符串匹配有多种方法,这里先讲最简单的两种算法: BF算法 和 RK算法,复杂度也相对较高。
它们均为单模式串匹配的算法,也就是一个串跟一个串进行匹配。

BF算法
简介

Brute Force,暴力匹配算法,也叫朴素匹配算法。
比较简单、好懂,但相应的性能也不高。

在字符串 A 中查找字符串 B ,那字符串 A 就是主串,字符串 B 就是模式串。
主串的长度记作 n ,模式串的长度记作 m ,所以n>m 。

算法思想

在主串中,检查起始位置分别是 0 、1、 2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的。

BF

时间复杂度

极端情况下,要比较 n-m+1 次,每次需要比对 m 个字符。所以最坏情况时间复杂度O(n*m)。

常用原因

虽然复杂度高,但实际开发中很常用,原因如下:

  • 大部分情况下,模式串和主串的长度都不会太长。每次模式串与主串中的子串匹配时,当中途遇到不能匹配的字符的时候,就可以就停止了,不需要把 m 个字符都比对;
  • 算法思想简单,代码实现简单。简单意味着不容易出错,如果有 bug 也容易暴露和修复。
RK算法

Rabin-Karp,由两位发明者名字而来。可以看做是BF的升级版。

算法思想

通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。
如果某子串哈希值与模式串相等,那就说明对应子串和模式串匹配(先不考虑冲突)。
哈希值是一个数字,数字之间比较是否相等是非常快速。

RK

提高哈希计算效率

哈希算法计算子串的哈希值时,仍需要遍历子串中的每个字符,需要改进。

改进方法: 要匹配的字符串的字符集中只包含 K 个字符,可以用一个 K 进制数来表示一个子串,这个 K 进制数转化成十进制数,作为子串的哈希值。

举例解释上述方法。

假如处理的字符串只包含 a-z 这26 个小写字母,那用二十六进制来表示一个字符串。
我们把26 个字符映射到 0~25 这 26 个数字。

再把二十六进制数转化成十进制数,进位从 10 改成 26 就可以。
在这里插入图片描述
这种计算方法,在主串中相邻两个子串的哈希值的计算公式有一定关系。
在这里插入图片描述

规律:相邻两个子串 s[i-1] 和 s[i] ( i 表示子串在主串中的起始位置,子串的长度都为 m ),对应的哈希值计算公式有交集。
公式表示如下:
在这里插入图片描述
事先计算好 26026^0260 、 26126^1261 、 26226^2262……26m−126^{m-1}26m−1 ,存储在长度为 mmm 的数组中,公式中的 “ 次方 ” 就对应数组的下标。
在这里插入图片描述

时间复杂度

第一部分:通过设计特殊的哈希算法,只需扫描一遍主串就能计算出所有子串的哈希值,所以时间复杂度是 O(n) 。
第二部分:需要比较 n-m+1 个子串的哈希值,比较的复杂度是O(1),总的复杂度也是 O(n)。

所以,RK 算法整体的时间复杂度就是O(n) 。

解决冲突问题

上面的哈希算法没有冲突,但是指数计算可能导致哈希值结果非常大,超出计算机表示范围。
解决方法就是允许冲突,从而减小计算范围。

允许冲突的哈希算法很多,举一个例子。

将每一个字母从小到大对应一个素数,把字符串中每个字母对应的数字相加,得到的和作为哈希值。

怎么解决冲突呢?其实很简单。
比较完哈希值后,
不相等的话,则无须比较,肯定不匹配;
相等的话,把两个字符串本身再比较一次即可。

这种方法前提是要控制冲突概率,达到可以接受的状态,否则算法会退化的厉害,变成 O(n*m) 。

本文是极客时间王争 数据结构与算法 课程的笔记,推荐此课,喜欢可以购买课程。

字符串匹配算法综述:BF、RK、KMP、BM、Sunday 阅读详情

相关推荐

字符串匹配算法

字符串匹配这样一个功能,我想对于任何一个开发工程师来说,应该都不会陌生。我们用的最多的就是编程语言提供的字符串查找函数,比如 Java 中的 indexOf(),Python 中的 find() 函数等,它们底层就是依赖接下来要讲的字符串匹配算法。 1.BF算法 BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。 在开始讲解这个算法之前,我先定义两个概念,方便我后

编程使我快乐 1714

算法五——字符串匹配(上)

文章内容、图片均来自极客时间。 1 概念和用途 字符串匹配:查找一个字符串A在字符串B中是否出现,这个过程就是字符串匹配。A称为模式串,B称为主串。主串的长度记为n,模式串长度记为m。n>mn>mn>m。 在java中有String的indexOf用就是字符串匹配。 字符串匹配有基础的BF算法、高效的KMP算法。 2 BF算法 BF=Brute Force 暴力搜...

约定的博客 500

字符串匹配基础(上):如何借助哈希算法实现高效字符串匹配?

------ 本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程 ------ 字符串匹配这样一个功能,我想对于任何一个开发工程师来说,应该都不会陌生。我们用的最多的就是编程语言提供的字符串查找函数,比如Java中的 indexOf(),Python 中的find()函数等,它们底层就是依赖接下来要讲的字符串匹配算法。 字符串匹配算法很多,我会分四节来讲。今天讲两种比较简单的、好理解的,...

every__day的博客 3405

串的模式匹配问题(含BF算法,KMP算法)

串模式匹配问题算法介绍 算法目的: 确定主串中所含子串(模式串)第一次出现的的位置(定位) 算法应用: 搜索引擎、拼写检查、语言翻译、数据压缩 算法种类: BF算法(Brute-Force,又称古典的、经典的、朴素的、穷举的) KMP算法(特点:速度快) BF算法 BF算法介绍 Brute-Force简称为BF算法,亦称为简单匹配算法,采用穷举的思想。 S:a a a a b c d 主串:正文串 T: a b c 子串:模式 ...

m0_63330233的博客 2456

入侵检测规则匹配算法--单模匹配算法、多模匹配算法、hyperscan

入侵检测规则匹配算法,分为单模式匹配算法和多模式匹配算法。 1. 单模式匹配 单模式匹配,就是一个串跟一个串进行匹配,常见算法有:BM算法和KMP算法。 1.1 BF (Brute Force)暴力匹配算法 作为最简单、最暴力的字符串匹配算法,BF 算法的思想可以用一句话来概括,那就是,我们在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配...

网络安全研究 1万+

BF算法查找字符串中字符

数据结构,BF算法,替换字符,查找字符,利用BF算法,一个一个回溯进行比较!~

重温算法Day15:字符串匹配

BF 算法和 RK 算法BF算法(朴素匹配算法)(暴力匹配):在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的。 RK算法:通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了。因为哈希值是一个数字,数字之间比较是否相等是非常快速的,所以模式串和子串比较的效率就提高了。 假设要匹配的字符串的字符集中只包含 K 个字符,我们可以用一个 .

Linzhongyilisha的专栏 389

Lisflood

文献:基于SWMM和LISFLOOD-FP模型的居住区低影响开发模拟评价。问题:多个节点溢流同时,不行,待解决。目录下,cmd命令行。

警警的博客 2663

4.2.1朴素模式匹配算法

4.2.1朴素模式匹配算法

weixin_57848728的博客 787

Oracle OCP 19c 认证1Z0-083考试大纲(Oracle官方版)

Oracle Database: Managing Multitenant Architecture Ed 1 course

#真题在线# 1588

AD/Protel老手才知道的PCB过孔查看技巧:3分钟分清通孔、盲孔和埋孔

本文为PCB设计工程师提供了在Altium Designer/Protel中快速鉴别通孔、盲孔和埋孔的实用技巧。通过层叠管理器、高级筛选工具和实战五步法,帮助用户在3分钟内精准识别过孔类型,提升设计效率和电路性能。特别适合处理高密度HDI板卡中的复杂过孔布局。

weixin_29164497的博客 575

字符串匹配算法之BF算法(即暴力算法)

1、BF算法 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。 2、C语言实现 #include<stdio.h> #include<assert.h> #include<string.h> /* str主串 sub

晨的博客 3818

遥感图像语义分割的全流程实现(Python代码)

本节介绍了加载遥感 RGB 图像和对应的单通道掩膜(mask)。掩膜中每个像素值为类别索引(如0=背景,1=植被,2=建筑),通过 transform 统一缩放(256×256)和归一化(ImageNet 均值/标准差),确保输入模型的一致性。# 自定义数据集类(适配遥感RGB+单通道掩膜)mask = Image.open(mask_path).convert("L") # 单通道掩膜return image, mask.squeeze(0).long() # 返回RGB图像和类别索引。

qq_42679807的博客 1852

C++实现BF、RK、KMP和BM~Qt6完成GUI

合肥工业大学《程序设计与算法训练》(即《数据结构》课程设计)的题目“字符串模式匹配算法比较”可以参考本项目。(最近闲得无聊练手Qt做的,毕业老学长奉上,蛤蛤蛤!)

u25th_engineer的博客 981

基于深度学习的涂胶缺陷类型检测:数据集处理与YOLOv8模型实现

本文提出了一种基于YOLOv8深度学习的涂胶缺陷检测系统,针对断胶、溢胶、缺胶、气泡及胶条宽度异常等常见缺陷类型,实现了从数据采集到模型部署的完整解决方案。系统采用工业相机采集涂胶图像,通过多形态数据增强策略解决样本稀缺问题,利用YOLOv8框架实现高效检测。相比传统人工目检和规则式机器视觉方法,该系统在检测精度(mAP达97.5%)和实时性(单图检测耗时0.038秒)方面表现优异,可满足智能制造场景下的涂胶质量检测需求。

huanghm88的专栏 271

SAP Event Mesh 简介

Get Started with Messaging for Decoupled Communication Step 1: What is the SAP Event Mesh service? SAP Event Mesh 是一种完全托管的服务,用于连接应用程序、服务和系统,以便它们可以通过消息和事件相互交互。 它通过引入中央消息代理取代了传统的点对点通信。 虽然点对点通信适用于在有限数量的发送方和接收方之间共享数据,但可扩展性很快就会成为一个问题。 SAP Event Mesh 解决了这个问题,并确保

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1243

如何快速掌握朴素字符串匹配算法:初学者必学的暴力搜索技术

朴素字符串匹配算法(BF算法)是数据结构和算法必知必会的50个代码实现中的基础技术,它通过简单直观的暴力搜索方式在文本中查找模式串,是理解复杂字符串匹配算法的入门钥匙。本文将带你轻松掌握这一算法的核心思想、实现步骤和实际应用价值。 ## 一、朴素字符串匹配算法:最简单的字符串查找技术 朴素字符串匹配算法(Brute Force Algorithm)的核心思想就像我们在字典中查找单词——从文本的

gitblog_00478的博客 387

一条时间轴上的商品供给:商品供给域事件全景、八大子域事件清单与事件契约规范的工程推演

本文以虚构连锁零售企业“青禾鲜市”为例,用事件风暴重新梳理商品供给域:先剖析同词异义、状态模糊、隐式依赖与被动兜底四类冲突,再以时间轴、八条子域泳道与关键事件铺出全景地图,确立一个事件只有一个户口;随后为总店商品、门店商品、价格、库存、质量、标签、变更通知与操作日志列出聚合、事件、命令与策略,并统一命名、信封结构、版本与幂等规范。程序体检把初稿14个问题清零,仿真显示按聚合版本号更新可售视图可将误判从两位数百分比降到0.019%。文末给出四轮工作坊节奏与新品引入、全国调价、批次召回走查剧本。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 5万+

LeetCode28. 实现strStr()

实现strStr() 题目链接 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例 1: 输入: haystack = “hello”, needle = “ll” 输出: 2 来源:力扣(LeetCode) BF 暴力法思...

码农在途的博客 108

29. 如何通过 ABAP 代码给 SAP OData 元数据增添注解

我们先看下效果,在 MPC_EXT 类的 DEFINE 方法里编写 ABAP 代码之后,用 Postman 使用 url 访问 OData metadata,在返回的数据里,能看到我们用 ABAP 代码添加的自定义注解。你好,请问可以不可以在odata里面通过什么设置,从而自动给metadata.xml中加上注解,实现value help的功能,还是说每次需要在metadata.xml中修改?的词汇引用,然后为命名空间 com.sap.vocabularies.UI.v1 声明了一个别名。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1660

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

各种字符串匹配算法【BF、BM、RK、KMP】

BF算法 基础的暴力比对算法,时间复杂度O(n)。 BM算法 BM字符串匹配算法 KMP算法 KMP算法!!!

前进!前进!! 436

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

字符串匹配算法知多少?

文章目录BF算法RK算法编辑器中的全局替换方法:BM算法坏字符好后缀规则代码实现KMP算法 一说到字符串匹配算法,不知道会有多少小伙伴不由自主的想起那个kmp算法呢? 想到是很正常的,谁让它那么优秀呢。 BF算法 不要被事物的表面现象所迷惑,这个算法全称:Brute Force,有个拉风的中文名:暴力匹配算法。 能想明白了吧。 如果模式串长度为 m,主串长度为 n,那在主串中,就会有 n-m+1 个长度为 m 的子串,我们只需要暴力地对比这 n-m+1 个子串与模式串,就可以找出主串与模式串匹配的子串。.

看,未来的博客 6799

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

字符串匹配算法之 BF、RK、BM

本文为极客时间《数据结构与算法之美》专栏的学习笔记。 本文目录: 1、BF 算法 2、RK 算法 3、BM 算法 3.1  BM 算法的核心思想  3.2  BM 算法原理分析 3.2.1  坏字符规则  3.2.2  好后缀规则 3.2.4  BM 算法代码实现 3.2.5  BM 算法的性能分析及优化 4、总结 本文主要讲述字符串匹配常用的几种算法,它们分别...

lucky__peng的博客 1129

字符串匹配算法(BF & RK)

文章目录1. BF(brute force)暴力匹配 1. BF(brute force)暴力匹配 BF算法的思想,在主串中,检查起始位置分别是0、1、2…n-m且长度为m的n-m+1个子串,看有没有跟模式串匹配的。最坏情况下每次都要对比m个字符,对比次数n-m+1次,复杂度O(m*n) ...

Michael是个半路程序员 1558

浅谈字符串匹配算法 —— BF算法、RK算法

概述 BF算法和RK算法都是单模式串匹配的算法。所谓单模式串匹配算法通俗来说就是一个串和一个串进行匹配 常见的单模式串匹配算法还有BM算法和KMP算法。 与之相对的就是多模式串匹配算法,就是在一个串中同时查找多个串,常见的有Trie 树和 AC 自动机。 两个概念 模式串和主串 我们在字符串 A 中查找字符串 B,那字符串 A 就是主串,字符串 B 就是模式串。...

qq_42006733的博客 877

字符串匹配之BF和RK算法

单模式串匹配算法:BF+RK

933
上一篇: 【数据处理】pandas DataFrame 实现 某列中分隔数据转成多行 split explode
下一篇: 【算法】字符串匹配2 BM算法 坏字符规则 好后缀规则 python代码实现
scxyz_
博客等级 码龄10年 304粉丝 61原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值