数据结构考研版——KMP算法

news2024/9/21 2:35:28

一、

我们先看下面这个算法当比较到不匹配的时候
在这里插入图片描述
模式串后移一位,并且让比较指针回去,这就叫做指针的回溯,回溯就是造成这个简单算法效率比较低的原因
在这里插入图片描述
这种是朴素模式匹配算法,时间复杂度比较高

int index(Str str,Str substr)
{
	int i=1,j=1,k=1;//串从数组下标为1的位置开始存储,因此初值为1
	while(i<i<=str.length && j<=substr.length)
	{
		if(str.ch[i]=substr.ch[j])
		{
			++i;
			++j;
		}
		else
		{
			j=1;
			i=++k;//匹配失败,i从主串的下一个位置开始,k中记录了上一次的起始位置
		}
	}
	if(j>substr.length)
	{
		return k;
	}
	else 
	{
		return 0;
	}
}

下面是一个简单的例子:
在这里插入图片描述

KMP算法就是从主串中找到与之相匹配的字串,KMP算法讲究的是一个快
我们回到刚刚位置不匹配的位置
第一比较指针左边上下两个字串是匹配的
在这里插入图片描述
而且这个模式串中有公共前后缀
在这里插入图片描述
接下来是KMP算法的核心要点,使得公共前后缀里的前缀移动到了原来后缀的位置
这样移动可以保证当前比较指针所在的位置左边的串上下是匹配的
在这里插入图片描述
当比较X的时候与主串不匹配的时候,只需要找出X之前的公共前后缀然后执行上述操作
如果模式串中有多个公共前后缀,那么我们就要取最长的那一个
在这里插入图片描述
接着我们继续移动
在这里插入图片描述
发现此时的移动后的模式串超出了主串的范围,所以就意味着匹配失败
在这里插入图片描述
再看一个例子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
移动后就发现了匹配的情况
**加粗样式**

二、

假如第一个位置发生了不匹配的情况,让数组下标为1的字符与主串中的下一位进行比较
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

假如第二个位置发生了不匹配的情况,发现箭头左边的字串长度只有一,而我们要求的是公共前缀的长度要小于这个字串的长度,此时的公共前后缀的长度就为0了
在这里插入图片描述
指针左边的长度就是公共前后缀的长度,为0
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里的数组下标相当于公共前后缀的长度+1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后就要引出一个next数组
假设求串′ababaaababaa′的next数组

1、在这里插入图片描述
2、前两个规定为0、1,上面述说了在这里插入图片描述
3、比较第三位的时候他们的公共前后缀为0在这里插入图片描述
next数组下标为1
在这里插入图片描述

4、比较第四位的时候,他们的公共前后缀为1 即a
在这里插入图片描述
next数组下标为2
在这里插入图片描述
5、比较第五位的时候,他们的公共前后缀为3 即ab
在这里插入图片描述
next数组下标为3
在这里插入图片描述
6、比较第六位的时候,他们的公共前后缀为aba
在这里插入图片描述
在这里插入图片描述
依次类推,不再赘述

三、求解next数组

在这里插入图片描述
上面的模式串红色部分为公共后缀
下面的模式串红色部分为公共前缀
长度为t-1
当前指针指向的那个是t
那么下一步就可以比较t+1的那个位置
在这里插入图片描述
如果Pj=Pt的时候
两个相加之后会使得他们的公共前后缀加1
在这里插入图片描述
也就是这一段的公共前后缀
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

MAVEN安装与配置

文章目录 一、安装MAVEN二、在IDEA中进行配置 一、安装MAVEN 打开MAVEN官网下载&#xff1a;https://maven.apache.org/download.cgi 选择这两个进行下载&#xff0c;然后直接解压缩到指定的安装目录即可。 配置环境变量 1&#xff09;MAVEN_HOME设置为maven的安装目录 2&…

指令段间及文件间参数调用过程(64位 Intel架构)

指令段间及文件间参数调用过程&#xff08;64位 Intel架构&#xff09; 文章目录 指令段间及文件间参数调用过程&#xff08;64位 Intel架构&#xff09;一. 指令段间的参数调用过程1.1 推论1.2 验证 二. 文件间的参数调用过程2.1 推论2.2 验证 三. 指令解释相关补充 一. 指令段…

基于html+css的图片展示24

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

docker安装rocketMQ

1、安装jkd1.8 docker pull java:8 或者 docker pull openjdk:8 查看已安装的镜像&#xff1a; docker images 运行jdk命令 docker run -d -it --name java-8 java:8 进入JDK 容器 docker exec -it java-8 /bin/bash 查看java版本&#xff0c;进入java-8容器后输入 &#x…

金融数字新型基础设施创新开放联合体今日成立

4月18日&#xff0c;“金融数字新型基础设施创新开放联合体”&#xff08;以下简称&#xff1a;联合体&#xff09;在上海成立。联合体由上海银行、复旦大学金融科技研究院、中电金信共同发起&#xff0c;首批成员单位汇聚产业链与供给侧的中坚力量&#xff1a;国泰君安证券、太…

基于 BaiduAI 的人脸检测系统(PyQt5图形化界面实现)

文章目录 写在前面的话总体结构学生端教师端教务处系统 总结 写在前面的话 前几天有个小伙伴私我会不会做关于人脸检测与识别的小项目&#xff0c;奈何我现在主要是学习研究NLP了&#xff0c;所以关于CV的很多东西也有点力不从心&#xff0c;突然想起来去年我的毕业设计就是做…

【Vue】学习笔记-内置指令/自定义指令

内置指令 自定义指令 内置指令v-text 指令v-html指令v-cloak指令v-once指令v-pre指令 自定义指令 内置指令 我们学过的指令&#xff1a; v-bind : 单向绑定解析表达式, 可简写为 :xxx v-model : 双向数据绑定 v-for : 遍历数组/对象/字符串 v-on : 绑定事件监听, 可简写为 v…

遍历思路与子问题思路:详解二叉树的基本操作

二叉树的结构定义&#xff1a; public class BinaryTree {//内部类 表示一个结点static class TreeNode {TreeNode left; //左子树TreeNode right; //右子树char value; //结点值TreeNode(char value) {this.value value;}}public TreeNode root; //根节点... } …

云原生时代下,应用全生命周期管理之道

引言 过去 10 年间&#xff0c;云计算已经从单一的 IT 服务演变成为新一代的软件架构范式&#xff0c;进而赋能企业管理和生产模式的创新。云计算也经历了从“资源上云”到“深度用云”的发展阶段。 在云原生时代&#xff0c;应用全生命周期管理之道成为企业关注的一个焦点。在…

蓝牙耳机什么品牌的音质好?300左右音质最好的蓝牙耳机推荐

随着蓝牙技术的发展&#xff0c;蓝牙耳机品牌也越来越多。要说什么品牌的音质好&#xff1f;首先还是要根据自己的预算出发。在此&#xff0c;我来给大家推荐几款300左右音质最好的蓝牙耳机&#xff0c;可以当个参考。 一、南卡小音舱Lite2蓝牙耳机 参考价&#xff1a;239 发…

Self-supervised learning of a facial attribute embedding from video

Self-supervised learning of a facial attribute embedding from video 译题&#xff1a;视频中人脸属性嵌入的自监督学习 论文题目Self-supervised learning of a facial attribute embedding from video译题视频中人脸属性嵌入的自监督学习时间2018年开源代码地址https://…

《Java》基本类型的比较和引用类型的比较

目录 基本类型 引用数据类型 基本类型之间的比较 基于Comparable的比较 总结 &#x1f451;作者主页&#xff1a;Java冰激凌 &#x1f4d6;专栏链接&#xff1a;Java 基本类型 Java中提供了基本类型有八种 分别是 byte short int long float double char boolean 基本类型…

EL 表达式--各种运算-代码演示--EL 的 11 个隐含对象--pageContext 对象介绍--JSTL 标签库介绍--core 核心库--综合代码

目录 EL 表达式 EL 表达式介绍 代码示例 EL 常用输出形式 代码演示 Book.java el_input.jsp EL 运算操作 基本语法语法&#xff1a; 关系运算 逻辑运算 算数运算 EL 的 empty 运算 应用实例 empty.jsp EL 的三元运算 应用实例 EL 的 11 个隐含对象&#xff0c…

Unity-ML-Agents-训练生成的results文件解读-PushBlock

前言 训练结果文件路径&#xff1a;E:\ml-agents-release_19\results\push_block_test_02&#xff08;具体路径以自己电脑为准&#xff09; ML-Agents安装和PushBlock训练过程请见&#xff1a;&#xff08;注意&#xff1a;push_block_test_02没有全部训练完毕&#xff09; …

同样是测试,朋友到了30k,我才12K,这份测试面试8股文确实牛

程序猿在世人眼里已经成为高薪、为人忠诚的代名词。 然而&#xff0c;小编要说的是&#xff0c;不是所有的程序员工资都是一样的。 世人所不知的是同为程序猿&#xff0c;薪资的差别还是很大的。 众所周知&#xff0c;目前互联网行业是众多行业中薪资待遇最好的&#xff0c;…

推荐几款项目管理工具,提高你的团队协作效率

如何管理团队才能使团队发挥最大的价值&#xff0c;如果团队缺少协作&#xff0c;就会因为团队的内耗和冲突导致项目无法完成&#xff0c;如何提高团队协作效率呢&#xff1f;我们可以借助团队协作类的项目管理工具。 几个常见的项目管理工具&#xff1a; 1、进度猫 进度猫是…

MySQL高级第十五篇:MVCC多版本并发控制原理剖析

MySQL高级第十五篇&#xff1a;MVCC多版本并发控制原理剖析 一、什么是MVCC&#xff1f;二、快照读与当前读&#xff1f;1. 快照读2. 当前读 三、MVCC实现原理&#xff08;ReadView&#xff09;1. 隐藏字段2. Read View3. 思路设计4. ReadView使用规则5. MVCC整体操作流程 四、…

响应式开发HTML5CSS3实现视频播放器的功能案例

目录 前言 一、本视频播放器需要实现的功能 ​二、代码分布结构 三、部分主要代码 1.index01.html 2.video1.css 3.video1.js 四、images图片资源及视频 五、运行效果 前言 1.本文讲解的响应式开发技术&#xff08;HTML5CSS3Bootstrap&#xff09;的HTML5视频播放器等…

随想录Day59--单调栈: 503.下一个更大元素II , 42. 接雨水

看到下一个更大&#xff0c;最先想到的就是单调栈。所以503.下一个更大元素II可以用单调栈的思路进行求解&#xff0c;其实这道题和496.下一个更大元素 I的思路是一样的&#xff0c;不过是多了一个首位相连的环状条件&#xff0c;这时候可以想到&#xff0c;把数组再复制遍历&a…

推荐系统|多目标建模|多目标优化|跨域多目标算法演进

目录 多目标建模总结 推荐系统——多目标优化 网易严选跨域多目标算法演进 背景介绍 多目标建模及优化 1.样本与特征 2. 模型结构迭代 3. 位置偏差与 Debias 4. 多目标 Loss 优化 5. 跨域多目标建模 多目标建模总结 http://t.csdn.cn/H514i 常见的指标有点击率CTR、…