模式匹配算法之超级通俗易懂的KMP

本文介绍了模式匹配算法中的KMP算法,通过对比暴力的BF算法,详细解析了KMP算法的工作原理,尤其是Next数组的概念,阐述了如何利用公共前后缀减少不必要的匹配,提高效率。
摘要由CSDN通过智能技术生成

模式匹配算法之KMP

1.何为模式匹配

简单的说就是字符串匹配,模式指的就是字符串,模式匹配说的就是在一串字符串(通常我们称之为主串)中去找另一串字符串(通常我们称之为模式串)。最常见到的例子就是很多文本工具都有的搜索和查找功能(在文本中查找某一个字符),再通俗的举个例子就是在abababcababab这个字符串中去看ababab这个字符串是否存在,前者abababcababab我们称为主串,而后者ababab我们称之为模式串,所以名称都是用来唬人的。

2.何为KMP
2.1.引言

上边描述完模式匹配的定义,估计有的小伙伴,特别是没有接触过C/C++语言的小伙伴会犯迷糊,心里可能会想,像在一些高级语言比如C#中,匹配字符串的功能非常之简单,string类型就已经实现了对字符的各种操作,别说是一个匹配功能了,就算是插入,删除等操作都不在话下。不错,高级语言中确实是实现了这些功能,但是,其底层是如何实现的呢?说到这,此时此刻,一团迷雾是不是笼上了你的心头?那么如何驱散这团迷雾呢,我们接着来…

2.2.BF算法
2.2.1.概念

描述到这,肯定有小伙伴会自告奋勇地说,在一串字符串中匹配另一串字符串,实现这个功能有何难?依次匹配不就好了,比如要在ccccab中匹配a,一个循环依次对比,有相等就匹配成功,有何难的,如果是匹配cca,就如下图:

KMP-2.2.BF算法

主串开始从第1个字符串和模式串进行对齐,然后一一对比,一旦出现失配的情况,主串再从第2个字符开始和模式串进行对齐,然后再一一比对,再出现失配的情况,主串再从第3个字符开始和模式串进行对齐,然后再次一一比对,直到匹配成功。

没错,这是最直接也是最容易想到的办法,一旦出现失配的情况,主串依次对齐模式串,然后一路比对下去,通常我们称之为暴力匹配算法,英文名叫做:Brute Force,简称BF算法。

2.2.2.暴力的来源

上边阐述了什么是BF算法,可是并没有对【为何取名为暴力,暴力又体现在哪里】进行说明,不知道有没有对此疑惑的读者。至于为什么要指出这点呢?其实是为了透过现象看本质,让读者可以更好地看清暴力算法的原始面貌,有哪些不足之处,然后,我们去蹂躏它,踩碎它,最终拨云见日。

俗话说,”能动手还动什么口“,在这里“动手”就是最直接最有效,也是最蛮力的做法,而暴力匹配算法中的暴力二字与“动手”有着异曲同工之妙,它不借力不使巧劲,有盲目匹配的称号,我用下图来解释它的盲目:

KMP-2.2.暴力来源

从图中可以看到当出现比对失败时,BF算法并不将已经匹配好的结果进行利用,主串依旧是傻傻地回到第2个字符串然后与模式串对齐,之后再进行接下去的比对,仔细观察主串和模式串,可以发现BF算法并非最优的解答,肉眼清晰可见

2.3.姗姗来迟的KMP
2.3.1.序言

笔者在暴力的来源里提到BF算法并非最优的算法,并且给出了另一种看起来更好的答案,这是必然还是偶然的呢?在这里笔者就不卖关子了,实际上这是必然的,而这必然结果对应的算法就是大名鼎鼎的KMP算法,KMP三个字母分别对应着三个人的英文名字的首字母,KMP算法就是这三个人共同思考出来的。好了,我们接着往下

2.3.2.前戏

这里的前戏内容,笔者认为是理解KMP算法的核心,是需要认识KMP算法前就应了解的概念。听起来有有木有一种高深莫测的感觉,其实,不然,笔者只是故弄玄虚了一下,哈哈哈哈。

要理解KMP,就需要知道字符串前后缀的概念</

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值