KMP算法与next数组【超详细】

news2024/11/24 22:57:52

一、朴素匹配法

S= "abgabcd"

T = "abcd"

假设有两个字符串,要判断字符串T是否在字符串S中出现过,你会怎么做?一般来说我们都是这样,一个一个对比:

#include<iostream>
using namespace std;
int main(){
	string S = "abefabcd";
	string T = "abcd";
	int count = 0;
	int cnt=0;
	cout<<"changduwei:"<<S.length()<<endl;
	for(int i=0,j=0;i<S.length();i++){
		cnt++;
		if(S[i]==T[j]) {
			count ++;
			j++;
			cout<<"count = "<<count<<endl;
			if(count == T.length()) { cout<<"找到一次咯"<<endl; break;}
		}else{
			count = 0;
			cout<<"count = "<<count<<endl;
			j =0 ;
		}
	}
	    
	cout<<"一共找"<<cnt<<"次,才找到"<<endl;
} 

1.2KMP算法的思想 

但是这样会很耗费时间,其实发现子串”abcd"与"abefabcd"的第1,2两位匹配这说明,并且子串中a之后再没有其他a了,这说明主串第2位不可能再和子串的第1位相匹配了,

可以跳过子串第1位和主串第二位比(跳过1->2,2->3,直接从1->3)。所以就有了KMP算法。

2.KMP算法步骤

1.找到第一个不匹配的位置 t

发现在第6个位置S中是"B",T中是"A"

2. 在小于t的位置找最长公共前后缀

这句话有三个点,我们剖析一下

2.1 小于t的位置

也就是在前面匹配的串中(暂时把它称为匹配子串),(在这道例题中也就是在1~5的位置:ABABA)找某个东西

2.2 前后缀

一个箭头从匹配子串的最前面开始,另一个箭头从匹配字串的最后一个往前延申,他们是互相奔赴的,找到前后相同的部分

 在这道例题中,上图中红色的A黑色的A就是一个匹配子串

2.3 最长

但是你发现这个箭头如果继续延伸,还是相同的 

ABAABA

如果再延长就是:ABABBABA 不相同

 继续延长箭头:ABABAABABA  可是这样有意义吗?这不就是同一个串?

所以上图就是最长公共前后缀了

3.前缀移动到后缀的地方

你前面找到最长的相同的部分不就是为了能够最快的跳过没有必要去比的地方吗,所以前缀移动到后缀的位置

一直重复这个操作,没看懂的去看(跳到8:01讲的就是这里)http://【【天勤考研】KMP算法易懂版】https://www.bilibili.com/video/BV1jb411V78H?vd_source=7f1e3551ae4b557a2f2008705a646502

三、next数组

next 是什么意思,是下一步的意思,所以next数组就是结合KMP算法来告诉你:如果当前位置不匹配,下一步要去找主串中的谁? 我们来一步步推一下,找找规律

为了方便表达,我们下面把所有不匹配的位称为当前位

例一:如果第一位就不匹配

最长公共前后缀长度=0

那就是1号位和主串下一位去比较,其实就是整个T往后移

 例二:如果第一位匹配,但第二位匹配

最长公共前后缀长度为 = 0

1号位和当前位比较

例三:三号位不匹配

最长公共前后缀长度 = 2,前缀移到后缀的地方

3号位和当前位比较

例四:四号位不匹配

最长公共前后缀长度 = 2,前缀移动到后缀的地方

3号位与当前位比较

例四:五号位不匹配

 

最长公共前后缀长度 = 1,前缀移动到后缀的地方

2号位与当前位比较

我们发现,每次都是 (最长公共前后缀长度 +1)号位与当前位比较

设最长公共前后缀长度为i,那么next数组里存的就是i+1.

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

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

相关文章

机器学习:逻辑回归

概念 首先&#xff0c;逻辑回归属于分类算法&#xff0c;是线性分类器。我们可以认为逻辑回归是在多元线性回归的基础上把结果给映射到0-1的区间内&#xff0c;hθ&#xff08;x&#xff09;越接近1越有可能是正例&#xff0c;反之&#xff0c;越接近0越有可能是负例。那么&am…

C++中list的使用

文章目录 一、 list简介二、 构造函数1. 默认构造函数2. 拷贝构造3. 迭代器区间初始化4. 插入n个值为x的数据5. 代码示例 三、 容量和元素访问1. empty()2. size()3. max_size()3. back()4. front()5. 代码示例 四、 增删查改1. push_back()2. push_front()3. emplace_back()4.…

stm32f103zet6_串口实现-DHT11-tim1(定时)

1思路 1打开时钟 1.1使用定时器实现us级的计时 1.2在打开串口 1,3在DHT11驱动中修改引脚 stm32cudeMX 配置 1打开时钟 2打开串口 3打开tim1(定时器) 4生成代码 代码设置 1导入DHT11库(tim.h是定时器的文件系统自动生成的) DHT11.c #include "dht11.h" #inc…

机器学习:基于Sklearn、XGBoost框架,使用逻辑回归、支持向量机和XGBClassifier来诊断并预测一个人是否患有自闭症

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

nuxt3使用记录五:禁用莫名其妙的Tailwind CSS(html文件大大减小)

发现这个问题是因为&#xff0c;今天我突然很好奇&#xff0c;我发现之前构建的自动产生的200.html和404.html足足290k&#xff0c;怎么这么大呢&#xff1f;不是很占用我带宽&#xff1f; 一个啥东西都没有的静态页面&#xff0c;凭啥这么大&#xff01;所以我就想着手动把他…

爬虫实战-房天下(bengbu.zu.fang.com/)数据爬取

详细代码链接https://flowus.cn/hbzx/3c42674d-8e6f-42e3-a3f6-bc1258034676 import requests from lxml import etree #xpath解析库 def 源代码(url): cookies { global_cookie: xeqnmumh38dvpj96uzseftwdr20lvkwkfb9, otherid: b44a1837638234f1a0a15e…

Android Studio的笔记--布局文件

关于Layout布局文件的使用 LinearLayoutRelativeLayout之前文章的内容一些常见性质在android.graphics.Color中定义了12种常见的颜色常数线性布局LinearLayout 一些常见使用文本框TextView设置文本内容编辑框EditText获取文本内容按钮Button控件使用其他按钮修改图标及名称添加…

HEVC/H.265视频编解码学习笔记–框架及块划分关系

前言 由于本人在学习视频的过程中&#xff0c;觉得分块单元太多搞不清楚其关系&#xff0c;因此本文着重记录这些分块单元的概念以及关联。 一、框架 视频为一帧一帧的图像&#xff0c;其编码的主要核心是压缩空间以及时间上的冗余。因此&#xff0c;视频编码有帧内预测和帧间…

C语言函数指针的使用、函数指针数组及使用、指向函数指针数组的指针,指针进阶版的冒泡排序等介绍

文章目录 前言一、函数指针的使用1. 加减乘除计算器普通实现2. 加减乘除计算机函数指针实现 二、函数指针数组1. 函数指针数组的书写2. 两个有趣的代码3. 函数指针数组的使用 三、指向函数指针数组的指针四、指针进阶_冒泡排序1.整型冒泡排序2. C语言qsort函数3. 仿写C语言qsor…

第十二章 案例二:配置Trunk,实现相同VLAN的跨交换机通信

1、实验环境 公司的员工人数已达到 100 人&#xff0c;其网络设备如图12.13所示&#xff0c;现在的网络环境导致广播较多网速慢&#xff0c;并且也不安全&#xff0c;公司希望按照部门划分网络&#xff0c;并且能够保证一定的网络安全性 图12.13 实验案例二拓扑图 其网络规划…

【AIGC调研系列】来认识一下:WebLlama

WebLlama是一个基于Meta Llama 3构建的代理&#xff0c;专门为了网页导航和对话进行了微调。它是由McGill University的自然语言处理团队开发的研究项目&#xff0c;旨在通过对话进行网页浏览的智能代理[1][2]。WebLlama的目标是构建有效的人为中心的代理&#xff0c;帮助用户浏…

格雷希尔E10系列大电流测试连接器,在新能源汽车大电流接插件的电气测试方案

在新能源汽车的电驱动、电池包等设备的电测试处理中&#xff0c;格雷希尔E10系列电测试连接器具有显著的优势。E10系列的核心设计——插孔/插针&#xff0c;可以达到实验室10万次的插拔寿命&#xff0c;相比传统公母电接头500次左右的连接寿命&#xff0c;E10系列无疑大大减少测…

PCL 梯度滤波

文章目录 一、简介一、简介二、实现代码三、实现效果参考资料一、简介 一、简介 点云梯度滤波是指基于每个点与邻近点之间的倾斜程度进行滤波的算法,其原理也很简单,如下图所示: CloudCompare中的做法是: d i r = A B

网盘——删除常规文件

本文主要讲解网盘中文件操作部分的删除常规文件部分&#xff0c;具体实施步骤如下&#xff1a; 目录 1、具体步骤&#xff1a; 2、代码实现 2.1、添加删除常规文件的协议 2.2、添加删除常规文件槽函数 2.3、关联槽函数 2.4、添加槽函数定义 2.5、服务器回复 2.6、客户…

推荐一个wordpress免费模板下载

首页大背景图&#xff0c;首屏2张轮播图&#xff0c;轮换展示&#xff0c;效果非常的炫酷&#xff0c;非常的哇噻&#xff0c;使用这个主题搭建的wordpress网站&#xff0c;超过了200个&#xff0c;虽然是一个老主题了&#xff0c;不过是经得起时间考验的&#xff0c;现在用起来…

06|LangChain | 从入门到实战 -六大组件之Agent

点点赞~ 注意&#xff1a;langchain的版本迭代比较快&#xff0c;社区维护&#xff0c;代码当中或许部分方法在某个版本不再支持 01&#xff5c;LangChain | 从入门到实战-介绍 02&#xff5c;LangChain | 从入门到实战 -六大组件之Models IO 03&#xff5c;LangChain | 从入…

《R语言与农业数据统计分析及建模》——多重共线性和逐步回归

一、多重共线性 多重共线性&#xff1a;在多元线性回归时&#xff0c;多个自变量之间存在高度相关关系&#xff0c;时模型估计失真或难以估计准确的情况。 一般地&#xff0c;多元线性回归中自变量间应尽量相互独立。常规模型诊断方法难以检测多重共线性。 1、案例解释 作物产…

嵌入式学习65-C++(继承.派生和QT布局管理)

知识零碎&#xff1a; 信号合槽&#xff1a; 对象间通信 …

《动手学深度学习(Pytorch版)》Task03:线性神经网络——4.29打卡

《动手学深度学习&#xff08;Pytorch版&#xff09;》Task03&#xff1a;线性神经网络 线性回归基本元素线性模型损失函数随机梯度下降 正态分布与平方损失 线性回归的从零开始实现读取数据集初始化模型参数定义模型定义损失函数定义优化算法训练 线性回归的简洁实现读取数据集…

Find My无人机|苹果Find My技术与无人机结合,智能防丢,全球定位

无人机是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机&#xff0c;或者由车载计算机完全地或间歇地自主地操作。无人机按应用领域&#xff0c;可分为军用与民用。军用方面&#xff0c;无人机分为侦察机和靶机。民用方面&#xff0c;无人机行业应用&#xff0c;是无…