首页 > 编程语言 >KMP算法学习笔记

KMP算法学习笔记

时间:2023-04-25 18:24:43浏览次数:562  
标签:前缀 后缀 DUCK 笔记 next 算法 KMP sim

总算把这个东西搞懂了......

KMP是一个求解字符串匹配问题的算法。

这个东西的核心是一个\(next\)数组,\(next_i\)表示字符串第\(0\sim i\)项的相同的前缀和后缀的最大长度。

这里的前缀和后缀概念略有不同,如 DUCK的前缀为 D,DU,DUC,后缀为 K,CK,UCK,不包含 DUCK本身。

再举一个例子,假设有字符串 DUCKDUCK,则相同的前缀和后缀的最大为 DUCK,因此\(next_7\)值为 \(4\)。

那么怎么求解呢?

对于\(i\),我们知道了\(S_{0\sim next_{i-1}-1}\)和\(S_{i-next_i-1\sim i-1}\)是一样的,如果\(S_{next_{i-1}}=S_i\)就最好,\(next_i=next_{i-1}+1\)。

如果不是怎么办?我们设\(t=next_{i-1}-1\),由于\(S_{0\sim next_{i-1}-1}\)和\(S_{i-next_i-1\sim i-1}\)是一样的,所以在两者的内部,肯定都会有一对长度为\(next_t\)大小的相同的前缀和后缀。

那么,我们考虑新的这个前缀后面等不等于\(s_i\),等于则问题解决,否则故技重施,再找出一个前缀。

可以手动模拟理解一下。

nxt[0]=-1;
for(int i=1;i<m;i++) 
{
	t=nxt[i-1];
	while(t!=-1&&s2[t+1]!=s2[i])t=nxt[t];//前缀不合法,继续找前缀
	if(s2[t+1]==s2[i])nxt[i]=t+1;//终于配上了一个前缀
	else nxt[i]=-1;//啥也配不上
}

有了这个\(next\)就方便许多了,我们将短的那个字符串的\(next\)算出,如果匹配失败,可以找出前面的,与后缀一样的部分,顶上来匹配,节省时间。

时间复杂度是\(O(|S|)\)的,也就是\(O(n)\)级别。

int i=0,j=0;
while(i<n)
{
	if(s[i]==s2[j])
	{
		i++,j++;
		if(j==m)
		{
			cout<<i-m+1<<endl;
			j=nxt[j-1]+1;
		}
	}
	else 
	{
		if(j==0)i++;
		else j=nxt[j-1]+1;
	}
}

标签:前缀,后缀,DUCK,笔记,next,算法,KMP,sim
From: https://www.cnblogs.com/I-am-joker/p/17353468.html

相关文章

  • 拉格朗日插值学习笔记
    这个算法的用途是,给出\(n\)个点,第\(i\)个点为\((x_i,y_i)\),它可以找出一个\(n-1\)次的多项式\(f(x)\),以便求出\(x\)值为其他情况。当然也是可以用来整活的,可以构造一些奇奇怪怪的多项式坑人。首先这个多项式存在是显然的,然后我们求它的方式是一个构造。我们考虑跟中国剩余......
  • SOA笔记
    1,SOA应用是面向服务的业务应用,是采用SOA的思想、模块化、可复用的业务应用。通过将SOA应用作为业务的载体,利用服务化的接口,实现在系统间、部门间甚至企业间的复用。和以往应用相比,SOA应用具有模块化、服务化、数据标准化、易集成、用户体验良好、灵活......
  • 代码随想录算法训练营第六天 | 242.有效的字母异位词 、349. 两个数组的交集 、 202.
    ......
  • 分治算法:剑指 Offer 25. 合并两个排序的链表
    题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 限制:0<=链表长度<=1000 解题思路:    classSolution{publicListNodemergeTwoLists(ListNodel1,ListNodel2){ListNodedum=newListNode......
  • 用Python实现十大经典排序算法
    用Python实现十大经典排序算法1.冒泡排序冒泡排序(BubbleSort)是一种比较简单的排序算法,它重复地走访过要排序的元素,依次比较相邻两个元素,如果它们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。算法过程比较相邻的元素,如果前一个比后一个大,就把它们两个对调位......
  • [Web app] 笔记
    如何回收应用池1.找到需要回收的webapp2.找到“应用服务编辑器(预览版)”,打开编辑器3.找到web.config文件,可以随意添加一点注释或修改任何内容,自动保存后即可进行应用池回收 ......
  • 老杜Vue实战教程完整版笔记(二)Vue核心技术
    动力节点老杜全新版Vue教程笔记分享给大家学习の地止:https://www.bilibili.com/video/BV17h41137i4视频教程从Vue2开始讲解,一步一个案例,知识点由浅入深,然后很自然的过度到Vue3版本。Vue3是目前企业中使用最多的一个版本。视频中会把每一个Vue的知识点讲解的非常通透,不但举例......
  • MEMORY REPLAY WITH DATA COMPRESSION FOR CONTINUAL LEARNING--阅读笔记
    MEMORYREPLAYWITHDATACOMPRESSIONFORCONTINUALLEARNING--阅读笔记摘要:在这项工作中,我们提出了使用数据压缩(MRDC)的内存重放,以降低旧的训练样本的存储成本,从而增加它们可以存储在内存缓冲区中的数量。观察到压缩数据的质量和数量之间的权衡对于内存重放的有效性是非常重要......
  • 排序算法之详解冒泡排序
    引入冒泡排序顾名思义,就是像冒泡一样,泡泡在水里慢慢升上来,由小变大。虽然冒泡排序和冒泡并不完全一样,但却可以帮助我们理解冒泡排序。思路一组无序的数组,要求我们从小到大排列我们可以先将最大的元素放在数组末尾再将第二大的数放在数组的倒数第二个位置再将第三大......
  • 虚拟存储管理中几种缺页中断算法计算逻辑
    题目一:在一个采用页式虚拟存储管理的系统中,有一用户作业,它依次要访问的页面序列是1,2,3,4,1,2,5,1,2,3,4,5.假定分配给该作业的页数为3且作业初始时未装载页面,那么采用FIFO调度算法产生的缺页中断数为多少,采用LRU调度算法产生的缺页中断数为多少?解析:FIFO调度算法:先进先出原则,当内存中存在,则......