简单模式匹配改进:KMP算法

回溯问题

上一讲 BruteForce算法的结尾中,我们提到了BruteForce算法的缺点,其中一条就是回溯问题,导致效率降低。

什么是回溯呢?

假设目标串S = "aaaaaaaab"  T="aaab" 当我们利用BruteForce算法时,前三次的"aaa"的比较是毫无意义的,换言之,就是影响了效率。

KMP算法

为了提高效率,因此我们要使用KMP算法。KMP算法是一种改进后的算法,并且是由D.E.Knuth、V.R.Pratt和J.H.Morris同时发现的,因此称之为KMP算法。

其基本思想为:每当匹配过程中出现字符串比较不等时,不需要回溯指针,而是利用已经得到的“部分匹配”结果整体模式向右“滑动”尽可能远的一段距离,继续进行比较。

如何实现这个思想,换言之如何判断得到部分匹配结果?这里我们需要完成KMP算法中的第一步也是核心步骤:模式串求最大真子串。

1.模式串求最大真子串

举个栗子


当J = 0 时 按照上面的思维导图公式,next[ j ] = -1



当 J = 1 时,next[ j ] = 0,因为我们想求模式串的最大真子串,而这个最大真子串是指不包含当前位置编号的字符,而是它前面的字符所构成的字符串里有没有最大真子串,因为 J = 1 时,模式串只有一个 a ,所以构不成最大真子串,因此属于其他情况,next[ j ] = 0


当 J = 2 时,next[ j ] = 1 ,因为当前位置编号的字符前面有2个 a,a 与 a 相等,满足我们的公式,并且他们的最大真子串长度为1(因为一个字符的长度为1),所以,记 next[ 2 ] = 1


当 J = 3 时,next[ j ] = 2,因为同理,当前位置编号的字符前面有3个 a,第一个a与第二个a构成的字符串==第二个a与第三个a构成的字符串,长度为2,所以,记next[ 3 ] = 2


一次类推,最后的结果如图所示,不再赘述了。下图为另一个例子,大家可以对照答案看看有没有掌握好。


PS:当 J = 8 时 ,应比较前七个字符中是否有最大真子串,我们发现只有第一个a 和 第七个 a 满足公式,因此next[ 8 ] = 1

最大真子串的实现代码!

最大真子串的算法需要理解,同学们跟着代码的逻辑思路对照图表理解效果更佳。

2.KMP算法原理

KMP算法原理:当Si ≠ Tj, 若模式串存在最大真子串,可将模式串T按照 k=next[ j ] 的值向右滑动,然后比较 Si 和 Tk ,若仍有Si ≠ Tk,则模式串T按照新的 k=next[ j ] 的值向右滑动后比较。这样的过程一直进行到 k = next[ k ] = 0,此时若Si ≠ T0,则模式串T不再向右滑动,随后比较Si + 1 和 T0 。

原理很枯燥而且很难理解,但还是要写,显得很高大上 ^_^ 大家能不看就不看吧~

我们还是根据例子和图表来进行理解!

举个栗子 例如:主串 S = "aaaaaaab"  子串 = "aaaab" 采用KMP的模式匹配过程。

对应的最大真子串集如图。

首先一次进行比较,发现aaaa全部相等,当 b 时也就是J = 4时,由于不匹配,所以整体向右滑动一格,并且比较子串的第四个a,以此类推,最后完全匹配时,仅需要10次,大大提升了效率!!!

KMP实现代码!


两个方法都写在了KMP类里,同学们依然要跟着代码分析一遍,重点是对于最大真子串的理解。

大家可以写一个测试类,声明两个字符串,看一看匹配的输出结果~

输出结果为3哦!

KMP算法总结

KMP算法的效率是很高的,遇到相关算法题时也应该使用该算法进行解题,多多熟练也是好的嘛!

下一讲我们将会讲一个有意思的小游戏---彩票机选的算法与实现 期间用到的相关知识 我会整理在一节中 内容可能较多哦!

PS:有什么问题或者不解的地方可以评论,我都会一一就行回复的,如果有错误或者言语不明的地方,还请大神多多指点!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章、这篇文章、还有这篇他们写得非常...
    sunhaiyu阅读 1,713评论 1 21
  • 引言 字符串匹配一直是计算机科学领域研究和应用的热门领域,算法的改进研究一直是一个十分困难的课题。作为字符串匹配中...
    潮汐行者阅读 1,609评论 2 6
  • 数据结构 第8讲 KMP算法 讲这个算法之前,我们首先了解几个概念: 串:又称字符串,是由零个或多个字符组成的有限...
    rainchxy阅读 1,250评论 0 3
  • 何为丰满人生? 行万里路,读万卷书,识万般人,悟万种情,拥万贯财,却携一人,白首一城。 可惜现实很骨感 只走百十里...
    从八到九阅读 75评论 0 0
  • 2017.2.14关键词:I型,沟通,影响 通过与@孙颖琪姐姐的沟通,更加明白了,I型真正在意的是自我的表达...
    生命君阅读 152评论 0 0