kmp形象理解

KMP算法(史上最清晰版本,每一步思路都仔细剖解) • 核心:next[i] 代表模式串 pattern[0..i] 的「最大相同前后缀长度」。• 构造:从 i=1 开始,用一个 j 指向前缀末尾,一旦不匹配就回退 j,直到匹配或回到 0。• 用途:在 KMP 主串匹配时,每次出现不匹配,可以借助 next[] 快速跳到合适的位置,避免重复扫描。 阅读详情

这是一个很好的算法思想 需要数形结合不然难理解欸

首先看next数组这是对模板串的一个操作

例如 abababab

不论哪一个模板串 next[1]一定为0

其次看

next[2]=0 解释只看前两个字符 ab 那么它的前缀为 a 后缀为 b显然没有相等的

next[3]=1 解释只看前三个字符 aba 那么它的前缀为 a,ab 后缀为 a,ba显然只有字符长度为1的时候相等

next[4]=2 解释只看前四个字符 abab 那么它的前缀为 a,ab,aba 后缀为 a,ab,bab显然有字符长度为1,2的时候相等(取最大)

next[5] ...

next[6] ...

next[7] ...

next[8] ...

这样我们next数组就完成了

之后就是比较操作了

f9a96dc2304c4d5083f7584f7fd18dfd.png

 

假设碰巧在圆圈处不相等 即s[i]!=p[j+1]前面的都相等 那么

9f8ec4b31b724e41b3cb335a63dcc023.png

可以看到我们已知蓝色两个区域相等右边蓝色又和左边蓝色相等那么粉色就和左边蓝色相等那么就可以让j移动到ne[j]

904c772a6fb5425ab1a1cb851c3058bc.png

向上图这样从ne[j]+1开始比直到j=n 就说明存在与模板串相等的子串

code:

#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=1000010;
char p[N],s[M];//p为模板串 s为要查询的串
int n,m,ne[N];
int main(){
	cin>>n>>p+1>>m>>s+1;
	for(int i=2,j=0;i<=n;i++){
		while(j&&p[i]!=p[j+1])j=ne[j];
		if(p[i]==p[j+1])j++;
		ne[i]=j;
	}//完成next数组
	for(int i=1,j=0;i<=m;i++){
		while(j&&s[i]!=p[j+1])j=ne[j];
		if(s[i]==p[j+1])j++;
		if(j==n){
			cout<<i-n<<" ";
			j=ne[j];//因为存在可能不止一个所以退回去重新找
		}
	}
}

 

 

 

KMP算法图文详解(为什么是next[0]=-1、next[j]=k和k=next[k]) 文章目录前言一:情景导入-如何快速在一个主串找到目标字符串二:详解KMP(1)暴力匹配的缺点(2)最长相同前缀和后缀(3)究竟怎么回溯(3)next数组(4)求解next数组A:next[0]=-1B:next[j]=kC:k=next[k](5)KMP算法代码 前言 KMP算法可以说是知名度非常高的算法了,不管是数据结构课本还是各大论坛都对这个算法进行过深入讲解,但遗憾的是,还是把大部分人给劝退了。 一:情景导入-如何快速在一个主串找到目标字符串 如下有两个字符串,问你:如何快速在主串中找到目标串? 当 阅读详情

相关推荐

用人类语言讲述KMP算法

我找到的KMP算法解释都太不人性化了,所以我自己写了一个。反正我是把自己给写懂了,你懂了吗?

zhangyixing1007_的博客 2162

对KMP算法中next数组的抽象理解

最近考研复习看数据结构,发现KMP算法并不是那么简单。在KMP算法中,最关键的地方就是Next数组的获得。 刚开始学的时候看getnext()函数的代码,感觉跟着程序推很难理解,尤其是那个j=next[j]。然后就尝试着抽象地去理解了一下,发现效果不错。 思路大概是这样的: 图中的绿色部分是主串和子串匹配的部分(图中只花了三个方块但实际个数不限),在第四个方块处,发生了不匹配,这个时候的...

qq_38758395的博客 245

教程 | 基于遥感生态指数(RSEI)模型的生态环境质量评价

使用数据:Landsat8 OLI数据,行列号:122036,时间:20210527。 使用软件:ENVI5.3、ArcGIS10.2 二、4个指数计算 下述的四个指数的计算均是通过ENVI软件中的Band math工具进行计算。 (1)绿度指数 在常用的植被指数当中,归一化植被指数 ( NDVI) 能够有效地反映植被的生长情况与植被 覆盖度等重要植被的物理性质,检测灵敏度高,能 够较为真实地展现区域的地表空间变化规律,已经得到广泛利用,本文采用 NDVI 指数来代表绿度指数。 在ENV

YW_remote的博客 1万+

谈谈对KMP算法的一些理解

谈谈对KMP算法的一些理解 这里是我看的原文,大佬讲的很清楚 下面是我自己对KMP的一些感悟和理解 首先,定义一些概念: 1.在某个字符串中找自己想要的字符串,那么【自己想要的字符串】就被称为模式串; 2.字符串的前缀是指从左到右看,始于第一个字符,后缀也是从左到右看,终于最后一个字符,前后缀相等就相当于前缀可以通过平移的方式到达后缀的位置,与后缀相重合,相重合(注意这个和回文的区别); 说到字符串的匹配问题, 首先,不得不cue一下BF算法,所谓的暴力匹配法,但是由于其效率过于低下(具体表现为每次发现某一

qq_49666427的博客 277

Transformer在量化交易中的应用:从时序预测到策略生成

Transformer模型凭借其强大的自注意力机制,在自然语言处理领域取得了革命性突破。其核心原理是通过并行计算和动态权重分配,有效捕捉序列数据中的长距离依赖关系。这一特性使其在金融时间序列分析中展现出巨大技术价值,能够处理市场数据中的复杂非线性模式和长期关联。在量化交易场景下,Transformer可将价格、成交量等连续数据通过离散化分桶处理,转化为类似文本的序列,进而进行预测或直接生成交易信号。本文以QuantGPT项目为例,探讨了如何将这一前沿AI架构迁移应用于金融领域,涵盖了从数据作为“语言”的编码

weixin_26757949的博客 365

Langchain cannot connect with Azure SQL Database

Langchain 无法连接到 Azure SQL 数据库

suiusoar 633

KMP算法的理解

KMP算法 本文内容主要来自天勤公开课的KMP算法讲解 KMP算法的作用 快速从一个主串中找到一段和模式串(字串)相同的串 一种简单的模式匹配算法: 模式串与主串左端对齐,开始逐个比较: 当扫描到某一个位置发现不匹配后,就让模式串后移一位,并且让比较指针回到模式串的第一位,再开始下一轮的比较: 这个过程中,比较指针从后面回到前面,称为比较指针的回溯。指针回溯是造成这个简单匹配算法效率比较低的主要原因。 但是KMP算法能做到仅让模式串后移,指针不回溯,提高算法的效率。 理解KMP算法的原理:如何

weixin_43762820的博客 765

[deprecated]第二章:DRM 框架概述:2.2 GEM显存管理概述

本文深入分析了Linux DRM子系统中GEM(Graphics Execution Manager)的显存管理机制。GEM通过核心数据结构drm_gem_object抽象显存buffer,结合drm_vma_offset_manager和drm_mm实现高效的地址空间分配与管理。该系统支持显存动态分配/回收、用户空间mmap映射、多进程访问隔离和跨设备共享等关键功能,并通过引用计数和同步机制确保并发安全。

图形/计算GPU的驱动与虚拟化技术分享园地 2541

常用十大算法_KMP算法

KMP算法 FBI提示:KMP算法不好理解, 建议视频+本文+其他博客,别走马观花 KMP算法是用于文本匹配的算法,属于模式搜索(pattern Searching)问题的一种算法,在讲KMP算法之前,传统的匹配字符算法是暴力匹配(BF算法)。一个字一个字的匹配,直到出现完全匹配的情况。 代码实现: package cn.dataStructureAndAlgorithm.demo.tenAlgorithm.KMP; public class 暴力匹配算法_字符串匹配 { publ..

泥煤少年的博客 2603

飞牛fnNAS个人小账本导入微信账单

本文介绍了将微信支付账单导入ezBookkeeping个人记账系统的详细方法。首先通过微信申请导出账单文件,接收后需进行Excel预处理:删除前导行、添加账户和分类列、整理金额格式等。在ezBookkeeping中需预先设置"微信"分类和账户。导入时需注意列映射关系,包括交易时间、账户名称等关键字段的对应设置。文章还提到处理交易标签、格式转换等细节问题,并建议避免使用"修改余额"功能。该方法同样适用于支付宝账单导入,解决了直接导入可能出现的格式不兼容问题。

dgnankai的专栏 482

如何成为一名高级数字 IC 设计工程师(6-7)数字 IC 验证篇:DEBUG 技巧

不懂验证的设计不是好的设计;UVM 验证思维是指导缜密的芯片设计的导师;推荐书籍《芯片验证漫游指南》。

新芯设计的博客 1605

KMP算法你真的懂了吗?详细讲解KMP算法,理解每一个细节

文章目录1. 前言2. KMP算法2.1 KMP算法介绍2.1.1 Why exit KMP2.1.2 KMP的思想3.1.3 KMP部分代码2.1.4 求next数组2.2 KMP算法的实现代码2.3 改进的KMP算法2.4 小结 1. 前言 本文中我使用的串方式如下图所示: 文中的串我都记为s s[0]不存放字符,从s[1]开始存放字符。 i表达指向主串的指针,j表示指向模式串的指针。 2. KMP算法 2.1 KMP算法介绍 2.1.1 Why exit KMP 传统的BF算法有一个缺点: 当

渐渐的忘记,赶不上明天(读研ing,2024年毕业) 1374

c++ webrtc基础(1) :webrtc源码下载与编译、项目模块介绍、学习资料推荐

本篇博客介绍webrtc源码的下载与编译,以及推荐webrtc学习资料。 源码下载 电脑环境:win10/win11 64bit,合理的上网环境,没有合理的网络环境无法拉取、下载webrtc代码和工具,宽带速度要快,尽量50M. 主要步骤如下: (1) 安装git (2) 打开cmd控制台,下载google开发工具depot_tools: git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git (3) 新建一个目

琅嬛福地 3295

图解KMP算法

图解KMP(C/C++)

m0_73096566的博客 1827

【PG高可用】一 PostgreSQL高可用方案repmgr部署(非常详细)

repmgr安装部署

DBA之路的博客 7054

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

一个全新的视角来看KMP算法(简单!形象!)

前面《字符串匹配》中我们介绍了KMP算法,《KMP算法Java实现》中给出了KMP算法的实现。 KMP算法很多人都说难,我第一次从《算法导论》中看到的时候也觉得难,后来重看算导时自己推导了一遍,觉得不难了,但是还是感觉印象不深,推导过后一段时间又会很模糊,下次遇到又得重新推。KMP算法原理上并不难,但是之所以给人难的感觉是因为它不够直观。今天突发奇想想到了一种将KMP算法图形化的方法,我

wyc的专栏 1684

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数据结构(邓俊辉)学习笔记】串 05——KMP算法:理解next[]表

KMP算法:理解next[]表

weixin_44399845的博客 2038

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python实现KMP算法

一.KMP算法 KMP算法应该是每一本《数据结构》书都会讲的,算是知名度最高的算法之一,KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。取了每个人的第一个字母所以叫KMP咯。 KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下...

weizhifei1234的博客 4920

KMP算法形象化说明

KMP算法用于在长字符串中找目标字符串。 最简单的匹配算法当然是拿目标字符串从长字符串开头开始一个一个匹配,如果不能全部匹配,就把目标字符串向后移动一位,继续匹配,如下图。 KMP的思想就是我不想每次匹配不成功了,一个位置一个位置挪了,我想每次能不能多挪几个,那么,如果大胆一点,我可以直接挪上一步已经比较过的字符个数个位置,在这里就是6个位置,如下图 但是我们也都知道,这样子

木樨zju的博客 485

通俗易懂的KMP算法(C++)

KMP算法是由Knuth,Morris和Pratt三位学者发明的,所以取了三位学者名字的首字母,称作KMP算法。KMP算法主要用在字符串匹配上。比如我们从字符串"acfacfgded"(需要在哪里找的字符串称为“文本串”)找其中是否包含字符串"acfg"(需要从文本串里找的字符串我们叫做“模式串”),我们一般会想到的解法是暴力求解,两层for循环,依次对模式串的每一个元素进行匹配,如果匹配失败,下次还从模式串的第一个进行匹配,这就导致了较高的时间复杂度(O(n×m))。

Wonderful1024的博客 2891

KMP算法详解

KMP算法虽然代码简单,但是理解起来还是颇为费力的,细节很多。包括next数组和k = next[k]等都是理解上的难点。所以我花了一个星期时间整理了这样一篇文章,从暴力算法开始到next数组和匹配过程,以及时间复杂度的证明和例题,希望能够完整地展示KMP算法的全貌,深入浅出地阐述KMP算法的思想。

qaqwqaqwq的博客 2094

我对KMP算法的浅层理解

串的模式匹配算法 KMP算法:o(n+m) S=‘ababcabcacbab’; T=‘abcac’; 相信大家在index_kmp这个函数方面都是没有问题的,那么我们直接进入get_next当中。 第一部分:原理部分 第一种实例:S[i-1]==T[i-1] && S[i]!=T[j] && { T[1]==T[j-1] } 得到 k-1=1(这个1是根据大括号内等是的数目决定的),即得到: next[j]-1=1, 即 next[j]=2

wzwwzwwzw1200的博客 382

KMP算法Java实现

之前的文章《字符串匹配》中介绍了KMP算法,下面给出其Java实现。 public class KMP { static final int MAX = 100; static int[] pi = new int[MAX]; //第一种方法 /** 思路:遍历T中的每一个字符,如果与P中的匹配,则二者游标递增,增到P的长度说明已经匹配,返回true * 如果不匹配,分两种情况

wyc的专栏 534

KMP入门+例题详解

这篇博客继续上篇博客开的坑,把字符串算法里,很重要也很基础的KMP算法总结一下。 简介 KMP算法主要用来处理字符串匹配问题(单模式串)。即给你两个字符串A,B,问是否B是A的子串。如果使用朴素的算法暴力查找,那么时间复杂度为O(nm),这是我们不能接受的,KMP算法就可以把时间复杂度降到O(n)。 实现方法 这里有两个字符串,A=“abababaababacb”,B=“ababacb”。我们用两个指针 i 和 j 分别表示,A[i-j+1…i]与B[1…j]完全相等。也就是说,i 是不断增加的,随着 .

hhhcbw的博客,欢迎各位来访 2646

关于KMP算法(多图详解)

KMP算法学习为什么用KMP算法暴利匹配算法KMP算法思路研究子串流程图 为什么用KMP算法 KMP是一种高效的模式匹配的一种算法 模式匹配,说直白就是找寻子字符串在主字符串的位置 (其实KMP这三个字没啥意义,这算法是3个人研究出来的,取3人名字首字母也就是KMP) 暴利匹配算法 与KMP相对立的一个算法就是暴力匹配算法,逐个字符一一对比 形象地理解就是 可以看到在这个简短的例子中,当主字符串(以下简称主串)对比到3时,与子字符串(简称子串)不同 那么就要折返到开始位置的下一位 如果主串再长点,对比的字符

makerjack001的博客 7278

C++ KMP算法

什么是前缀:字符串的前缀是指从第一个元素开始的、不包括最后一个元素的连续字串。什么是后缀:字符串的后缀是指不包括第一个元素的、以最后一个元素结尾的连续子串。最长相等前后缀:字符串的最长相等前后缀就是字符串的前缀、后缀中相等的、最长的连续子串。例如,对于字符串"acdac"。还有一种形象一点的理解,就是你,

weixin_47755728的博客 1384
上一篇: 手动实现离散化
下一篇: 散列表/哈希表 字符串的哈希
姐姐带你拿捏大厂算法
博客等级 码龄5年 17粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值