专栏名称: 算法与数据结构
算法与数据结构知识、资源分享
目录
相关文章推荐
算法与数学之美  ·  工信部计算机视觉设计开发工程师认证——成就A ... ·  昨天  
九章算法  ·  一年被裁两次,一个底层码农的大落大起 ·  3 天前  
九章算法  ·  H1B恐暴毙!马斯克遭华人抨击! ·  3 天前  
知产力  ·  新年献词 | 算法之光,让创新温暖你我 ·  2 天前  
知产力  ·  新年献词 | 算法之光,让创新温暖你我 ·  2 天前  
算法与数据结构  ·  95后AI“天才少女”刷屏!雷军千万年薪挖角 ... ·  4 天前  
51好读  ›  专栏  ›  算法与数据结构

动画:七分钟理解什么是KMP算法

算法与数据结构  · 公众号  · 算法  · 2019-07-30 11:46

正文

本文是介绍什么是BF算法KMP算法BM算法三部曲之一。

KMP算法内部涉及到的数学原理与知识太多,本文只会对KMP算法的运行过程、部分匹配表next数组进行介绍,如果理解了这三点再去阅读其它有关KMP算法的文章肯定能有个清晰的认识。

以下的文字描述请结合视频动画来阅读~

定义

Knuth-Morris-Pratt 字符串查找算法,简称为KMP算法,常用于在一个文本串 S 内查找一个模式串 P 的出现位置。

这个算法由 Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发表,故取这 3 人的姓氏命名此算法。

是不是感觉 Donald Knuth 这个名字很眼熟?没错,在前面这或许是讲解 Knuth 洗牌算法最好的文章一文中也出现了他!

KMP算法的操作流程如下:

  • 假设现在文本串 S 匹配到 i 位置,模式串 P 匹配到 j 位置

  • 如果 j = -1,或者当前字符匹配成功(即 S[i] == P[j] ),都令 i++,j++,继续匹配下一个字符;
    如果 j != -1,且当前字符匹配失败(即 S[i] != P[j] ),则令 i 不变,j = next[j]。此举意味着失配时,模式串 P相对于文本串 S 向右移动了 j - next [j]  位

  • 换言之,将模式串 P 失配位置的 next 数组的值对应的模式串 P 的索引位置移动到失配处

运行过程

以下图文本串 S 与模式串 P 为例:

首先,列出模式串 P 的所有子串:

a






ab





aba




abaa



abaab


abaabc

abaabca
abaabcac

然后,求得每一个子串的所有前缀与后缀。

前缀指除了最后一个字符以外,一个字符串的全部头部组合;后缀指除了第一个字符以外,一个字符串的全部尾部组合。

以第五列为例进行演示。

前缀

a


ab

aba
abaa

后缀

b


ab

aab
baab

因此,它的前缀后缀的公共元素的最大长度为2

求得原模式串 P 的子串对应的各个前缀后缀的公共元素的最大长度表下图。

根据最大长度表去求next 数组next 数组相当于“最大长度值” 整体向右移动一位,然后初始值赋为-1

好了,获取了next 数组后,KMP 算法的操作就很清晰了。

将模式串 P 与文本串 S 的字母一个个进行匹配,当失配的时候,模式串向右移动。

怎么移动?

比如模式串的b与文本串的c失配了,找出失配处模式串的next数组里面对应的值,这里为0,然后将索引为0的位置移动到失配处。

后记

市面上好多讲解KMP算法的文章的写的太混乱了,很多人因此产生了恐惧,这一章目的就是为了能让大家能大概理解KMP算法的运行过程,不会畏惧KMP算法 。

我也把视频上传到了B站,喜欢在B站学习的小伙伴可以扫描下面的二维码去观看,欢迎点赞收藏投币~





●编号970,输入编号直达本文

●输入m获取到文章目录

推荐↓↓↓

Java编程