KMP算法的基本操作和自我理解

1.1 KMP所需要的解决的问题

KMP,是三个人名字的总和缩写.它主要解决的问题就是字符串匹配问题.即给出一个一定长度的字串和一个文本,要求你找出这个字串在文本中出现第一次的位置,然后字串和文本的长度可能很大.

如这样一个题:POJ-3461

题意大概就是找出第一个字符串在第二个字符串中出现次数.

1.2 传统暴力算法

暴力算法就是,通过暴力搜索,从第一个字母开始匹配.如果不匹配,那么就将整个字串往后移动一位.再重新进行匹配.这样的算法(On^2)显然在一些情况下复杂度会变得不可承受.但是我们通过理解可以发现,这个算法慢的主要原因就是因为当发现有字母不匹配时,就只能往后移动一位.然后KMP就是优化了这个往后跳的方式.以此达到优化时间的目的.

1.3 KMP算法的具体操作过程

先不说这个算法的原理,因为我就是先知道的操作过程,然后才大概理解的.

1.3.1 最长前后缀字串

我们引进一个概念,最长前后缀字串

如同这样一些字符串:

abccsab 它的最长前后缀字串就是 ab

abssc 它没有最长前后缀字串

aaaaa 它的最长前后缀字串是aaaa

1.3.2 next数组

我们首先需要进行这样一步操作.将这个字串分成

原文地址:https://www.cnblogs.com/Kv-Stalin/p/8419594.html

时间: 2024-10-10 08:48:49

KMP算法的基本操作和自我理解的相关文章

KMP算法具体解释(转)

作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解说KMP算法的时候,言语磕磕碰碰,我想,原因有二:1.博客内的东西不常回想,忘了不少:2.便是我对KMP算法的理解还不够彻底,自不用说解说自如,运用自如了.所以,特再写本篇文章.因为此前,个人已经写过关于KMP算法的两篇文章,所以,本文名为:KMP算法之总结篇. 本文分为例如以下六个部分: 第一部分

[转]KMP算法

KMP字符串模式匹配详解 分类: 算法 2013-02-12 19:26 2380人阅读 评论(0) 收藏 举报 个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详 细”,耐心地把它看完肯定会有所收获的--,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数 f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1,不过还是next[j]这种表示法好理解啊: KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说

[hiho 03]KMP算法

题目描述 暴力解法:枚举原串起始位置,逐个匹配,复杂度O(mn). 优化思路:失配时,前面已匹配的字符可以提供信息. KMP算法: 对于模式串任意位置 i ,如果我们知道一个 k 使得 i 位置前的 k 个元素和模式串最开始的前 k 个元素一一相等,那么第 i 个元素失配时就可以之间从第 k + 1 个元素开始继续匹配,这就利用到了失配前的匹配信息. 于是我们想构造这样一个数组 next_val[]  使得 next_val[i] 指向第 i 元素失配时下一个匹配的位置. 例如对于模式串abca

【数据结构与算法】字符串匹配KMP算法

首先需要了解一下BF暴力匹配算法,这个算法为每一个串设置一个指针,然后两个指针同时后移,出现不匹配的情况后,主串指针回到开始后移之前的位置的下一位,模式串指针回到最开始. 对比一下KMP算法,同样是设置两个指针,然后两个指针同时后移,出现不匹配的情况后,主串指针不变,模式串指针回溯一定的距离.具体模式串指针回溯多少,是第一次看KMP算法的人比较难以理解的,其实仔细想想,模式串的前缀和后缀其实也是在做匹配,当P[K]!=P[J]时就是失配,那么前缀的指针就需要回溯,所以后k=next[k]. 代码

【详解】KMP算法

前言 KMP算法是学习数据结构 中的一大难点,不是说它有多难,而是它这个东西真的很难理解(反正我是这么感觉的,这两天我一直在研究KMP算法,总算感觉比较理解了这套算法, 在这里我将自己的思路分享给大家,也是检验一下自己有没有真正掌握这个算法,错误的地方也请大家指正.嘤嘤嘤~~~ 注:可供参考的资料有很多,视频的话个人推荐B站的UP主正月点灯笼,博客的话有很多,不过不要贪多,不然容易混乱,不同的人对这个算法也是有不同的理解的! 背景 了解一个算法你要明白它的出处,KMP算法是由三位大牛同时研究出来

字符串匹配KMP算法的理解(详细)

1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够,故才迟迟没有修改本文. 然近期因开了个算法班,班上专门讲解数据结构.面试.算法,才再次仔细回顾了这个KMP,在综合了一些网友的理解.以及算法班的两位讲师朋友曹博.邹博的理解之后,写了9张PPT,发在微博上.随后,一不做二不休,索性将PPT上的内容整理到了本文之中(后来文章越写越完整,所含内容早已不再是九张PPT 那样简单

KMP算法详细理解

KMP算法详细理解 从昨天开始看KMP算法到今天凌晨..... 把一些知识点进行总结,其实KMP还是挺简单的(HHHHHH) 博客新地址:https://miraitowa2.top/ 1:BF(暴力匹配)算法 假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符: 如

KMP算法的理解

---恢复内容开始--- 在看数据结构的串的讲解的时候,讲到了KMP算法——一个经典的字符串匹配的算法,具体背景自行百度之,是一个很牛的图灵奖得主和他的学生提出的. 一开始看算法的时候很困惑,但是算法思想很简单,就是在暴力匹配的基础上得出的. 暴力匹配 这里有必要说一下暴力匹配,暴力匹配更简单,就是按照人的常规思维去匹配字符串,拿模式串(P)的第一个字符去和给定串(S)比较,S从左往右看,一看,第一个,呀~不对,啥也不说了,第一个都不对了,后边还比个毛.所以,这一次比较,S中第一个字符开头是匹配

深入理解KMP算法

首先从直观上看KMP存在的价值: 一般在遇到字符串匹配的问题的时候,一种朴素的比较方式就是 int BFMatch(char *s,char *p) { int i,j; i=0; while(i<strlen(s)) { j=0; while(s[i]==p[j]&&j<strlen(p)) { i++; j++; } if(j==strlen(p)) return i-strlen(p); i=i-j+1; //指针i回溯 } return -1; } S:  ababca