理解KMP算法

简单理解KMP

本文读者可以获得两方面的知识

  1. 直观理解如何生成部分匹配表(下文简称匹配表),这是KMP算法的核心思想
  2. KMP算法的实现

算法描述

输入

  • text
  • pattern

输出

  • text(长串)匹配到的pattern(短串)位置

常见应用

在网页中搜索关键字(常用快捷键ctrl+f)

naive方法

可以使用2层for循环,时间复杂度O(m*n),m/n分别是text和pattern的长度

生成匹配表

只针对pattern

刚开始看KMP算法,总是看不懂的原因就是因为对匹配表的功能理解不深。尤其是试图理解KMP算法时,下一个匹配位置根据匹配表的值进行跳跃,有些人就开始问为什么了。理解匹配表之后,KMP算法自然而然就理解了。

匹配表的构建基于真前缀,真后缀,让我们先理解它们。

对于pattern='abab'来说,真前缀有

a
ab
aba

注意不包括pattern本身abab,这体现了“真”前缀而区别于前缀

同样,真后缀包含

bab
ab
b

可以发现规律:真前缀总以第一个字符开头,真后缀总以最后一个字符结尾

不要小看这个规律,它极大地帮助理解匹配表。(请再次默读一遍啊上述规律😁)

到了理解KMP算法核心的时候了,我们把pattern拉长以便更好展示,pattern='abcdeeeeabcd',不通过真前缀和真后缀,能不能一眼看出最长匹配,还记得上边提到的规律吗?画张图帮助理解

这样找到的最长匹配就是abcd,是真前缀和真后缀匹配的最优解,时间复杂度为pattern长度的线性时间。KMP算法中的跳跃到下一个位置,简单讲就是图中左边的匹配跳跃到右边的匹配,这就是KMP算法的核心。

使用匹配表(KMP算法)

当理解了上述的匹配表生成,如何使用自然而然。

todo后续补充

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 概述 字符串是编程中常用的一种数据结构,在各个方面都有广泛的应用,而字符串的一种基本操作就是给定一段长度为N...
    millions_chan阅读 504评论 0 1
  • 字符串匹配KMP算法详解 1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有...
    张晨辉Allen阅读 2,461评论 0 3
  • 1.KMP算法是什么? 1.1 KMP算法求解什么类型问题 字符串匹配。给你两个字符串,寻找其中一个字符串是否包含...
    mirqzb阅读 1,614评论 0 1
  • 深入理解KMP算法 时间:20180313 KMP算法的核心是 求公共最大前后缀。 画图分析 继续分析如何利用前后...
    pianpianboy阅读 208评论 0 0
  • 写在前面 字符串的一种基本操作是子字符串查找:给定一端长度为N的文本字符串text和一个长度为M(M<N)的模式字...
    安卓大叔阅读 5,884评论 3 11