首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

KMP算法详解

上一篇文章我们学习了字符串匹配算法中的BF算法,BF算法是一种暴力的匹配算法,思想很简单,但是效率并不是特别可观,因此这篇文章我们再来学习一种比较高效的字符串匹配算法——KMP算法 KMP算法...算法思想 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。...KMP算法的时间复杂度O(m+n)。 (百度百科) 单凭这段话,大家肯定不能理解这个算法 2....图解 那下面我们还是通过一个具体的例子来给大家详细的讲解一下KMP算法KMP算法呢可以认为是对BF算法(所以学这篇文章之前建议大家先看一下我的上一篇讲解BF算法的文章)的一个优化,它和BF的算法的区别在于...<< KMP("ababcabcdabcde", "abcdef", 0) << endl; cout << KMP("ababcabcdabcde", "c", 0) << endl; return

2K10
您找到你想要的搜索结果了吗?
是的
没有找到

(原创)详解KMP算法

KMP算法应该是每一本《数据结构》书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么一回事,但总感觉有些地方自己还是没有完全懂明白...这两天花了点时间总结一下,有点小体会,我希望可以通过我自己的语言来把这个算法的一些细节梳理清楚,也算是考验一下自己有真正理解这个算法。...什么是KMP算法KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!!...大牛们是无法忍受“暴力破解”这种低效的手段的,于是他们三个研究出了KMP算法。...所以,整个KMP的重点就在于当某一个字符与主串不匹配时,我们应该知道j指针要移动到哪? 接下来我们自己来发现j的移动规律: ? 如图:C和D不匹配了,我们要把j移动到哪?显然是第1位。为什么?

70270

KMP算法的实现详解

1.KMP算法 1.概念 KMP是一种改进的字符串匹配算法,该算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。...2.与BF(暴力算法)的的区别 暴力算法:模拟实现strstr函数 当信息匹配失败时,主串i不会回退,子串j也不会回到0号位置 3.分析 1.j的回退位置 在下标为5时,信息匹配失败,此时i...+; k++; } else { k = next[k]; } } } int KMP...-1; } int main() { char s1[40]; char s2[40]; scanf("%s%s", s1, s2); printf("%d\n", KMP...1时 只有第一个数对应next数组的值为-1,说明主串与子串第一个数就信息匹配失败 而在if循环中如果不加入j==-1的判断 ,只有 sub[i]==sub[j],则会造成越界 2.KMP

53620

KMP算法学习(详解)

kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法。不过由于其难以理解,所以在很长的一段时间内一直没有搞懂。虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚。...在此,综合网上比较好的几个博客(参见最后),尽自己的努力争取将kmp算法思想和实现讲清楚。...kmp算法通过一个O(m)的预处理,使匹配的复杂度降为O(n+m)。 kmp算法思想 我们首先用一个图来描述kmp算法的思想。...next数组计算 理解了kmp算法的基本原理,下一步就是要获得字符串f每一个位置的最大公共长度。这个最大公共长度在算法导论里面被记为next数组。...复杂度 kmp算法的复杂度是O(n+m),可以采用均摊分析来解答,具体可参考算法导论。 参考资料 1.     kmp算法小结 2.     kmp算法详解 3.     kmp算法 4.

91050

动态规划之 KMP 算法详解

有一些优秀的同学通过手推 KMP 算法的过程来辅助理解该算法,这是一种办法,不过本文要从逻辑层面帮助读者理解算法的原理。十行代码之间,KMP 灰飞烟灭。...一、KMP 算法概述 首先还是简单介绍一下 KMP 算法和暴力匹配算法的不同在哪里,难点在哪里,和动态规划有啥关系。...暴力算法 很明显,pat中根本没有字符 c,根本没必要回退指针i,暴力解法明显多做了很多不必要的操作。 KMP 算法的不同之处在于,它会花费空间来记录一些信息,在上述情况中就会显得很聪明: ?...kmp算法 因为 KMP 算法知道字符 b 之前的字符 a 都是匹配的,所以每次只需要比较字符 b 是否被匹配就行了。...下面看一下 KMP 算法根据这幅状态转移图匹配字符串txt的过程: ? kmp算法运行过程 请记住这个 GIF 的匹配过程,这就是 KMP 算法的核心逻辑!

1.7K20

KMP算法-之next数组-详解

KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度。...当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容。...在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,...这个next数组的求法是KMP算法的关键,但不是很好理解,我在这里用通俗的话解释一下,看到别的地方到处是数学公式推导,看得都蛋疼,这个篇文章仅贡献给不喜欢看数学公式又想理解KMP算法的同学。...从上面的理论我们就能得到下面的前缀next数组的求解算法

5.9K72

一文详解 KMP 算法

解法; 如果是一道中等题(数据范围 ~ )的话,则是在考察我们 KMP 等字符串匹配算法。...KMP 解法 KMP 算法是一个快速查找匹配串的算法,它的作用其实就是本题问题:如何快速在「原字符串」中找到「匹配字符串」的下标。...上述的朴素解法,复杂度近似是 的,而 KMP 算法的复杂度为 。...,对于匹配串 abcabd 的字符 d 而言,由它发起的下一个匹配点跳转必然是字符 c 的位置。因为字符 d 位置的相同「前缀」和「后缀」字符 ab 的下一位置就是字符 c。...总结 KMP 算法的应用范围要比 Manacher 算法广,Manacher 算法只能应用于「回文串」问题,相对比较局限,而「子串匹配」问题还是十分常见的。

86652

动态规划之 KMP 算法详解

很多读者抱怨 KMP 算法无法理解,这很正常,想到大学教材上关于 KMP 算法的讲解,也不知道有多少未来的 Knuth、Morris、Pratt 被提前劝退了。...有一些优秀的同学通过手推 KMP 算法的过程来辅助理解该算法,这是一种办法,不过本文要从逻辑层面帮助读者理解算法的原理。十行代码之间,KMP 灰飞烟灭。...一、KMP 算法概述 首先还是简单介绍一下 KMP 算法和暴力匹配算法的不同在哪里,难点在哪里,和动态规划有啥关系。...i,而 KMP 算法又会耍聪明: kmp算法 因为 KMP 算法知道字符 b 之前的字符 a 都是匹配的,所以每次只需要比较字符 b 是否被匹配就行了。...下面看一下 KMP 算法根据这幅状态转移图匹配字符串txt的过程: kmp算法运行过程 请记住这个 GIF 的匹配过程,这就是 KMP 算法的核心逻辑!

59330

动态规划之 KMP 算法详解

总结     6.1 动态规划和 KMP 算法的关系     6.2 KMP 算法的优点和缺点     6.3 KMP 算法的应用前景和发展趋势 下面对每个部分进行详细的解释: 1. ...什么是 KMP?     2.1 KMP 的定义     KMP(Knuth-Morris-Pratt)算法是一种字符串匹配算法,基于动态规划的思想。...3.2 KMP 算法中的状态机    在 KMP 算法中,我们可以使用一个状态机来记录模式串和待匹配字符串的匹配过程。...6.3 KMP 算法的应用前景和发展趋势     KMP 算法在字符串匹配和文本处理领域有着广泛的应用,例如搜索引擎、自然语言处理、图像处理等。...随着互联网的不断发展和智能化水平的提高,KMP 算法的应用前景将越来越广泛。同时,KMP 算法也有一些改进和优化的方向,例如基于哈希表的 KMP 算法、基于 AC 自动机的 KMP 算法等。

86820

KMP算法

KMP算法 在正式进入KMP算法之前,不得不先引经据典一番,因为直接去理解KMP,你可能会很痛苦(别问,问就是我也痛苦过)。...字符串 字符串这个概念就不过多介绍了,毕竟,相信点开这篇文章的,怎么说也是掌握 了至少一门编程语言的coder了吧,那对于诸如此简单的知识点相信还是没什么大问题的。...因此,引出了今天的主角KMP算法。 通过上面的演示,不难得出BF算法的代码。...+版本 ---- KMP算法完整代码 搞清楚了next数组的求解,kmp算法也就是信手拈来的事了。...复杂度分析 BF算法 O(mxn) KMP算法 O(m+n) 补上八股文 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特

77420
领券