菜狗的KMP学习

这篇具有很好参考价值的文章主要介绍了菜狗的KMP学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为什么我们要学习KMP呢?这就不得不说起当年暑假在校队集训的时候,苦逼做不出题目的痛苦时光了。

三个人看着题目中字符串匹配的那个环节,思索了整整三个小时。

不得不说,从0到1,远比在前人的肩膀上前行要难得多。真不知的这些变态大佬是怎么想出来的。

先来提及一下,当时我们用人脑想出来的代码(我没有说他们不是人:对于大部分人来说,那肯定就是一个个照着去比对就行了,然而很遗憾的是:

可惜时间太短,我无法爱上你——超时......

这就是那所谓的BP算法

1.朴素模式匹配(BP)

由于这个真的太基础,懒得废话了。就是应该去主串和模式串一个个去配对,如果该字符匹配,则j++,否则j=0,然后i++

int index_BP(string s,string p){
	int sl=s.length(),pl=p.length();
	for(int i=0;i<=sl-pl;i++){
		int flag=1;
		for(int j=0;j<pl;j++){
			if(s[i+j]=!p[j]){
				flag=0;
				break;
			}
		}
		if(flag)
		return i;
	}
	return -1;
}

2.KMP算法(三个人名...)

(1)前缀与后缀

什么是前缀和后缀捏?

ju个栗子,比如说有个字符串“abac”,那么对于该字符串而言,“a”,“ab”,“aba”则是它的前缀(PS:严格来讲,“abac”和空串也可以算作前缀)。

相应的,对于后缀而言就是,“c”,“ac”,“bac”等。

(2)next数组

这个时候,可能就会想前后缀和字符串的匹配有什么关系呢?其实,重点就在于信息的重复利用。

比如说,对于模式串“abdad”而言,如果在第5个字符“d”的时候不匹配,那么我们不需要再次去重头可以匹配,因为对于字符串“abda”而言,有相同的前后缀“a”。

所以我们只需要从“b”开始进行相应的配对即可。

从这里就可以看出,KMP算法实质就是利用当前字符前的字符子串的相同前后缀,来跳过大量没有意义的重复匹配。

这个是相关的动画。。。有点丑,而且有点慢,但是,菜狗的我不会调速度

菜狗的KMP学习

接下来就是求next数组了,next数组是利用模式串得到的。

那为什么要叫做next数组呢?那是因为如果当前字符不匹配,下一个要比对的模式串的字符是哪个。

菜狗的KMP学习

相应的计算公式如上所示。

(3)相关的代码

int mynext[200000];
void get_next(string s){
	int l=s.size(),k=-1;
	mynext[0]=-1;
	for(int i=1;i<=l;){
		if(k==-1||s[i]==s[k]){
			i++;k++;
			mynext[i]=k;
		}
		else k=mynext[k];
	}
}
int index_kmp(string s,string p,int pos){
	int i=pos,j=0;
	int sl=s.size(),pl=p.size();
	for(i=pos,j=0;i<sl&&j<pl;){
		if(j==-1||s[i]==p[j]){
			i++;j++;
		}
		else j=mynext[j];
	}
	if(j>=pl) return i-pl;
	else return -1;
}

3.相关例题

P3375 【模板】KMP - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Password - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)文章来源地址https://www.toymoban.com/news/detail-843661.html

到了这里,关于菜狗的KMP学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么我们需要去中心化存储?

    为什么我们需要去中心化存储? 我们的社会正处于前所未有的信息大爆炸时代,未来将是数据成为主要生产要素的数字时代,而 Web3 也不外乎于此,作为数据解决方案——去中心化存储,不仅是区块链技术的三大支柱(计算、存储、网络)之一,也是 Web3 领域最早出现也最受

    2024年02月02日
    浏览(84)
  • 我们为什么需要API管理系统?

    我们为什么需要API管理系统? 随着web技术的发展,前后端分离成为越来越多互联网公司构建应用的方式。前后端分离的优势是一套Api可被多个客户端复用,分工和协作被细化,大大提高了编码效率,但同时也带来一些“副作用”: 接口文档不可靠。很多小伙伴管理接口文档,

    2024年02月12日
    浏览(67)
  • 什么是Web3.0?为什么我们需要 Web 3.0

    为了更好地理解什么是 Web 3.0,我们需要知道什么是 Web 1.0 和 2.0。 为了不让你厌烦,这里简单的解释一下: WEB 3.0 例子:xiaqo.com Web 1.0  —— 信息仅从网站传递给用户。 Web 2.0  —— 信息是双向的。 用户可以与网站交互互动。 Web 3.0  —— 伟大的超越。 信息变得开放、分散

    2024年02月03日
    浏览(62)
  • Elasticsearch:什么是向量和向量存储数据库,我们为什么关心?

    Elasticsearch 从 7.3 版本开始支持向量搜索。从 8.0 开始支持带有 HNSW 的 ANN 向量搜索。目前 Elasticsearch 已经是全球下载量最多的向量数据库。它允许使用密集向量和向量比较来搜索文档。 向量搜索在人工智能和机器学习领域有许多重要的应用。 有效存储和检索向量的数据库对于

    2024年02月08日
    浏览(51)
  • 视觉化洞察:为什么我们需要数据可视化?

    为什么我们需要数据可视化?这个问题在信息时代变得愈发重要。数据,如今已成为生活的一部分,我们每天都在产生大量的数据,从社交媒体到购物记录,从健康数据到工作表现,数据无处不在。然而,数据本身通常是冷冰冰的数字,对于大多数人而言,理解和分析这些数

    2024年02月10日
    浏览(50)
  • 什么是分布式操作系统?我们为什么需要分布式操作系统?

    分布式操作系统是一种特殊的操作系统,本质上属于多机操作系统,是传统单机操作系统的发展和延伸。它是将一个计算机系统划分为多个独立的计算单元(或者也可称为节点),这些节点被部署到每台计算机上,然后被网络连接起来,并保持着持续的通信状态。在分布式操作

    2024年02月16日
    浏览(52)
  • 伙伴云CEO戴志康:我们为什么要做伙伴云?

    分享嘉宾: 戴志康,伙伴云CEO 以下为演讲实录⬇⬇⬇ 01选择人更少的一条路,从B级走向A级 我一直想和大家交流一个话题,关于我们为什么要做伙伴云。既代表我自己,同时也代表我们团队的一些想法。 我是一个怀疑论者。大多数人公认正确的事情,就一定是正确的吗?这

    2024年02月16日
    浏览(42)
  • 【云原生-白皮书】简章1:为什么我们需要云原生架构?

    声明:本文为《阿里云云原生架构核心技术白皮书》的一些读书笔记与感想。 一文大致了解云原生架构模式特点传送门:五分钟了解云原生的架构模式 声明:本文是阅读阿里云云原生架构核心技术白皮书的一些读书笔记与感想。 云原生架构是一种创新的软件开发方法,专为

    2023年04月26日
    浏览(56)
  • NFTScan Labs:我们为什么要推出 L2 网络 Mint Blockchain?

    NFT(非同质化代币)是一种储存在区块链上的加密数据单位,它可以代表身份、合同、权益、声誉、社交关系等独一无二的数字资产。与比特币等加密货币不同,NFT 资产不可互换,每一枚 NFT 都是独一无二的链上资产。NFT 资产可以在区块链上进行自由的转账和交易、抵押借贷

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包