4.5.KMP算法(旧版上)-朴素模式匹配算法的优化

图解KMP算法,带你彻底吃透KMP KMP算法一直是一个比较难以理解的算法,本篇文章主要根据《大话数据结构》中关于KMP算法的讲解,结合自己的思考,对于KMP算法进行一个比较详细的解释。 阅读详情

朴素模式匹配算法最坏的情况:


一.实例:

第一轮匹配失败,开始下一轮的匹配:

不断的操作,最终匹配成功:

如上述图片所述,朴素模式匹配算法会导致时间开销增加,

优化思路:主串指针不回溯,只有模式串指针回溯

主串指针不回溯:

如果上述图中?是g:

如果上述图中?不是g:

另一种情况如下:

如果在j为5时匹配失败(j为模式串的指针),那么主串中分别以第5个字符即g,第6个字符即o,第7个字符即o开头的子串都不可能与模式串匹配,但第8个字符即g开头的子串有可能与模式串匹配成功,因为第8个字符即g能与模式串第一个字符g匹配上,而且在匹配过程中只是说明了子串中第9个字符与模式串中j为5时对应的字符不匹配,并没有说明子串中第9个字符与模式串中第二个字符不匹配,接下来只需要看i对应的字符即第9个字符是否与模式串中第二个字符即o是否匹配:

再下一种情况:

如果在j为4时匹配失败(j为模式串的指针),那么主串中分别以第3个字符即g,第4个字符即o,第5个字符即o开头的子串都不可能与模式串匹配,此时就需要开始判断主串中第6个字符是否与模式串中第一个字符是否匹配,但其实j为4时匹配失败已经说明主串中第6个字符不是g了,因此主串中第6个字符已经不可能与模式串中第一个字符匹配,可知该方案并不是最优解,这种方案会使得多进行一次不必要的判断,但相比朴素模式已经优化了很多:

再再下一种情况:

如果在j为3时匹配失败(j为模式串的指针),那么主串中以第四个字符即o开头的子串一定与模式串匹配失败,但此时只知道主串中第五个字符不是o,因此可以判断主串中第五个字符是否是g,以主串中第五个字符开头来重新开始与模式串的匹配,相比朴素算法也优化了很多:

再再再下一种情况:

如果在j为2时匹配失败(j为模式串的指针),那么主串中以第三个字符即g开头的子串一定与模式串匹配失败:

汇总:

对于next数组,该数组的意思是当模式串的指针j等于next数组中的某一个值时,如果发生不匹配,如j为5时不匹配,就要回到j为2这个位置;

但当j为1时发生了不匹配,j设置为0:

代码:

形参中S为主串,T为模式串,还有与T对应的next数组,i指向主串,j指向模拟串,while循环中j不为0且i指向的字符和j指向的字符不相等时才执行else语句里的j=next[j]:

与朴素算法不同的有第一个if语句中j==0和第一个else语句中的j=next[j],

现在假设主串为xgoo,模式串为google,一开始j为1,指向模拟穿里的g,i为1,指向主串里的x,

由于i和j指向的字符不匹配(不相等),根据j=next[j],会让j=next[1],此时j为0,下一轮循环时发现j为0,

++i后i为2指向主串里的g,++j后j为1指向模拟串里的g,由此就推出为什么把next[1]设为0,因为可以利用这个信息做一个特殊的判断,当j为0时就说明主串的指针i也应该往右移动了,此外当i指向的字符和j指向的字符都相等时也应该把i和j同时往后移:


KMP模式匹配算法 朴素的模式匹配算法 对主串的每一个字符作为子串的开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做需匹配长度的小循环,直到匹配成功或者全部遍历完成为止 示例程序(朴素的模式匹配)int Index(char *S, char *T) { int i, j; // 直到遍历主串完成或者需匹配字符串全部匹配成功 for (i = 0, j = 0; i < (in 阅读详情

相关推荐

字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)

字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct { char str[MAXSIZE]; int length; }seqstring; 朴素的模式匹配算法 基本思想:用p中的每一个字符去与t中的字符一一比较。 模式p 正文 t 如果匹配成功,则返回p在t中首次出现的起始位置 如果匹配不成功则返回-1 最坏情况比...

( :3 ) 2579

串的模式匹配算法(朴素算法、KMP算法及其优化)

本文介绍了两种模式匹配算法:朴素算法(BF算法)和KMP算法。朴素算法通过逐个字符比较实现,时间复杂度为O(nm)。KMP算法利用next数组避免主串指针回溯,提高了效率。重点讲解了next数组的计算方法,包括手动计算和代码实现,并提出了KMP算法的优化版本,通过nextval数组进一步减少不必要的比较。优化后的KMP算法在处理重复字符模式串时表现更优。

主要更新数据结构与算法相关内容 1287

KMP匹配的模式算法——保姆级解读(图文版)

一,写在前面 了解一种优化和高效算法,是基于一定普通算法改良和提升的,讲KMP算法前,我们应该首先了解朴素的模式算法。 二,朴素的模式匹配算法 找一个单词在一篇文章(相当于一个大字符串)中的定位问题。这种子串的定位操作通常称做串的模式匹配,应该算是串中最重要的操作之一。 假设我们要从下面的主串 S="goodgoogle”中,找到T=“google"这个子串的位置。我们通常需要下面的步骤。 1.主串S第一位开始,S与T前三个字母都匹配成功,但S第四个字母是d而T的是g。第一位匹配失败。如图所示,其中

耀的博客 4356

KMP算法详解

KMP算法是一种字符串模式匹配算法,不同的来源讲解方式也不一样,很容易混乱,在这里以一种特殊的方式来讲解KMP算法,希望大家不再被这个问题所困扰。 一. 一些基础问题 什么是字符串的模式匹配? 给定两个串S=“s1s2s3 …sn”和T=“t1t2t3 …tn”,在主串S中寻找子串T的过程叫做模式匹配,T称为模式。 如何寻找? 我们先从比较好理解的暴力匹配(朴素模式匹配BF算法)开始,进而引出K...

yyzsir的博客 9万+

字符串匹配——朴素算法、KMP算法

字符串匹配(string match)是在实际工程中经常会碰到的问题,通常其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置。通常精确的字符串搜索算法包括朴素搜索算法,KMP, BM(Boyer Moore), sunday, robin-karp 以及 bitap。下面分析朴素搜索算法和KMP这两种方法并给出其实现。假设原字符T串长度N

sinat_24520925的专栏 8748

KMP模式匹配算法原理分析、next数组优化及java实现

朴素的模式匹配算法通过对主串进行回溯,每次在匹配不成功时回溯到主串的i-j+2的位置(i为主串中匹配失败的位置,j为模式串中匹配失败的位置,其中模式串字符数组从位置1开始),KMP算法采用next数组,避免对主串的回溯,主要分析模式字符串的特征,确定在匹配失败情况下通过next数组获取应该模式串应该回溯的位置,next数组目的在于当主串和模式串的字符匹配发生失败时,可以获取模式串回溯的位置,从新和主串进行匹配

code4grow专栏 3930

朴素模式匹配算法和KMP匹配算法 详细

朴素模式匹配算法和KMP匹配算法 一、朴素模式 假设我们要从主串S=”goodgoogle"中找到子串T=“google"的位置,步骤如下: i表示主串的当前位置下标,j表示子串的当前位置下标,如上图在第一轮比较(i=1开始)中j=4和i=4的位置不匹配,接下来就要指针回退,从i=2开始比较,如下: 如此反复直到比较到 i =(主串长度-子串长度+1)的位置或者 j = 子串的长度 就退出比较...

weixin_44026997的博客 2981

有限元分析必看:如何用ANSYS检查关键区域的网格质量(附操作截图)

本文聚焦有限元分析中决定仿真精度的关键环节,详细讲解了如何利用ANSYS Workbench对关键区域进行网格质量检查与优化。文章提供了从思维转变、实战操作到指标解读的完整流程,强调通过命名选择、Worksheet过滤器等工具实现定向检查,并给出了针对结构分析的关键区域网格质量阈值建议,帮助工程师提升仿真结果的可靠性与效率。

weixin_29200741的博客 467

(算法)通俗易懂的字符串匹配KMP算法及求next值算法

大多数据结构课本中,串涉及的内容即串的模式匹配,需要掌握的是朴素算法、KMP算法及next值的求法。在考研备考中,参考严奶奶的教材,我也是在关于求next值的算法中卡了一下午时间,感觉挺有意思的,把一些思考的结果整理出来,与大家一起探讨。 以下的顺序为 1、最基本的朴素算法 2、优化的KMP算法 3、应算法需要定义的next值 4、手动写出较短串的next值的方法 5、最难理解的、足足有5行的代码...

Sirm23333 16万+

NU1680无线充电接收器在TWS耳机中的应用实战:I2C调压与QI协议适配

本文详细解析了NU1680无线充电接收器在TWS耳机充电仓设计中的应用实战。重点阐述了其无固件设计、I2C接口动态调压功能如何解决不同QI协议发射器的兼容性难题,并分享了硬件设计、PCB布局、与发射端联调及安全测试等关键环节的实践经验,助力开发者快速实现稳定高效的无线充电方案。

weixin_28432777的博客 232

Altair HyperWorks 2022.3.0 Suite下载

Altair HyperWorks开发团队提供了新的一流技术,以设计和优化高性能、高效和创新的产品,并发布了HyperWorks 2021.2套件。与所有新版本一样,这个版本包含了新特性、增强功能,并修复了前一个版本中用户报告的各种问题,提供了总体上更稳定的体验。链接: https://pan.baidu.com/s/1rYietmQLQUboHiJzYoE9WQ?pwd=m9yh 提取码: m9yh 复制这段内容后打开百度网盘手机App,操作更方便哦。

weixin_48469365的博客 2127

图解KMP算法

图解KMP(C/C++)

m0_73096566的博客 1827

Windows下的Geant4安装教程

本教程将从0开始展示在Windows下如何安装Geant4,包括各种辅助工具(QT、Cmake、Visual Studio)的下载安装,环境变量的配置,以及example的生成等。

weixin_49065278的博客 4111

【串】串的模式匹配算法(BF+KMP)(C语言)

串的模式匹配算法(C语言) 1.字符串的初始化函数 定义一个字符数组S,我们用第0位来存储该字符串的长度,其余位置顺序存储该字符串。(字符串的首位从1开始) 代码实例: #include <stdio.h> #include <string.h> #define N 100 /*静态定义数组的长度*/ typedef char String[N]; // String s1 等价于 char s1[N] int StrAssign(String T,

weixin_51424157的博客 3968

验证(uvm常见问题)--子类和父类的句柄和对象问题

sv中的子类和父类 在sv中,有如下两个类,child继承于parent。然后在test module中,正确转换的方法如下面所示。其中c1,c2,p1 都指向了同一个子类的对象c1。总结如下: 一个子类的对象是包括子类的成员变量,方法和父类的成员变量,方法。 子类的句柄c1可以直接赋值给父类的句柄p1,此时p1只可以访问父类的成员变量和方法,或者子类的虚方法,比如下面调用p1.display是...

q876507447的博客 7633

1991-2020年气候背景数据集

2011 年,国家气象信息中心对 1951-2010 年 2400 余个地面站气温、气压、降水、湿度、日照等 19 大要素项的定时观测资料和日极值资料中由数字化过程中引起的系统性问题(例如数字化遗漏、整段拷贝等问题)进行质量检测、质量控制和错误数据的更正,形成较高质量的地面基础资料集。1991-2020年中国地面气候值数据集提供了中国2438个站点的气温、降水、气压、风向风速、相对湿度、水汽压、云、天气现象、能见度、蒸发、积雪、地温、冻土、日照共14个要素的气候背景信息。数据时间:30年平均。

地球资源数据云的官方博客 1597

数据结构——串(朴素的模式匹配算法、KMP模式匹配算法)

数据结构——串(朴素的模式匹配算法、KMP模式匹配算法) 键盘上的钢琴师_v5 提示:以下内容不适合零基础人员,仅供笔者复习之用。 概要: 串是由零个或多个字符组成的有限序列,又名叫字符串。 一、串的比较 给定两个串,s = "a1a2.....an",t="b1b2....bm",当满足以下条件之一时,s<t。 n<m,且ai = bi(i=1,2,.....,n)。例如,s="hap",t="happy",就有s<t。 存在某个k<=min(m,n),使得...

cxu123321的博客 3160

实战篇| app爬虫不用真机

之前写过一篇基于真机app爬虫《App爬虫实战篇-以华为真机手机爬取集换社的app为例》,如果大家有用真机爬虫的经历,会深刻认识到真的不方便,一是自己的手机,经常会被电话、微信等打断,二是闲置手机,面对小批量数据还能勉强,大批量爬虫,会导致成本指数级上升,并且控制起来相对麻烦。以下就是常见的模拟器。emulator -avd my_avd -no-snapshot-save # 启动时不保存 snapshot。emulator -avd my_avd -wipe-data # 清除数据(恢复到出厂)

youbingchen的博客 597

一文帮你搞懂 | 串的模式匹配-朴素匹配和KMP算法及优化

朴素模式匹配算法 KMP算法 求模式串的next数组 总结:求模式串的next数组 KMP算法优化 本篇文章参考王道数据结构内容,详细引导KMP算法的内容

莫浅子的博客 1433

YOLO26小目标检测实战:STAL标签分配+MuSGD优化,VisDrone数据集漏检率降50%

小目标检测是计算机视觉的经典难题,而VisDrone数据集小目标占比极高:数据集中小目标(像素面积<32×32)占比超过60%,且大量目标仅为几个像素,特征信息极度匮乏;背景复杂且干扰多:无人机航拍场景包含建筑物、树木、人群、车辆等复杂背景,小目标易被背景淹没;尺度变化与遮挡严重:同一目标在不同帧中尺度差异大,且小目标极易被其他目标遮挡;传统模型的固有缺陷标签分配策略(如ATSS、SimOTA)偏向大目标,小目标的正样本分配不足,导致模型对小目标不敏感;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1186

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

KMP算法与朴素模式匹配算法(C语言)

在上一篇博客中介绍了KMP算法和朴素模式匹配算法的区别,本文主要针对这两种算法的C语言实现进行讲解。

2Know的博客 3507

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【数据结构】字符串的朴素模式匹配算法

字符串匹配是计算机科学中的一个基本问题,特别是在文本处理、搜索引擎、数据挖掘等领域都有广泛的应用。朴素模式匹配(Naive String Matching)是一种非常直观的解决方案,尽管它在效率上并不是最优的,但其简洁性和易懂性使得它成为学习字符串匹配问题的基础。本文将深入探讨朴素模式匹配算法的原理、实现过程以及实际应用。

XuanRan的博客 4073

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【考研】串的模式匹配算法——KMP算法(含真题)

本文内容源于对《数据结构(C语言版)》(第2版)、王道讲解学习所得心得、笔记整理和总结,以便复习。【考研】《数据结构》知识点总结.pdf_考研数据结构知识点总结-其它文档类资源-优快云文库【2023考研】数据结构常考应用典型例题(含真题)_住在阳光的心里的博客-优快云博客目录前言一、基本概念二、KMP算法三、KMP算法的进一步优化四、习题。

qq_34438969的博客 8750

朴素的模式匹配算法与KMP模式匹配算法

串的模式匹配:子串的定位操作 例如要从主串"goodgoogle"中到"google"这个子串的位置(第一个字符的位置)。 朴素的模式匹配算法: 也就是从主串的第一个元素开始循环一个子串的长度逐个比较,直到匹配成功或无法完成一个子串长度的循环。 KMP模式匹配算法: ...

weixin_61898526的博客 886
上一篇: 4.4.朴素模式匹配算法
下一篇: 4.6.KMP算法(旧版下)-朴素模式匹配算法的优化
巧克力拌面
博客等级 码龄3年 1153粉丝 282原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值