字符串匹配的KMP算法--前缀和后缀的详解

article/2025/9/14 21:34:42

字符串匹配的KMP算法

作者: 阮一峰

字符串匹配是计算机的基本任务之一。

举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?

许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。

这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。

1.

首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较。因为B与A不匹配,所以搜索词后移一位。

2.

因为B与A不匹配,搜索词再往后移。

3.

就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止。

4.

接着比较字符串和搜索词的下一个字符,还是相同。

5.

直到字符串有一个字符,与搜索词对应的字符不相同为止。

6.

这时,最自然的反应是,将搜索词整个后移一位,再从头逐个比较。这样做虽然可行,但是效率很差,因为你要把"搜索位置"移到已经比较过的位置,重比一遍。

7.

一个基本事实是,当空格与D不匹配时,你其实知道前面六个字符是"ABCDAB"。KMP算法的想法是,设法利用这个已知信息,不要把"搜索位置"移回已经比较过的位置,继续把它向后移,这样就提高了效率。

8.

怎么做到这一点呢?可以针对搜索词,算出一张《部分匹配表》(Partial Match Table)。这张表是如何产生的,后面再介绍,这里只要会用就可以了。

9.

已知空格与D不匹配时,前面六个字符"ABCDAB"是匹配的。查表可知,最后一个匹配字符B对应的"部分匹配值"为2,因此按照下面的公式算出向后移动的位数:

  移动位数 = 已匹配的字符数 - 对应的部分匹配值

因为 6 - 2 等于4,所以将搜索词向后移动4位。

10.

因为空格与C不匹配,搜索词还要继续往后移。这时,已匹配的字符数为2("AB"),对应的"部分匹配值"为0。所以,移动位数 = 2 - 0,结果为 2,于是将搜索词向后移2位。

11.

因为空格与A不匹配,继续后移一位。

12.

逐位比较,直到发现C与D不匹配。于是,移动位数 = 6 - 2,继续将搜索词向后移动4位。

13.

逐位比较,直到搜索词的最后一位,发现完全匹配,于是搜索完成。如果还要继续搜索(即找出全部匹配),移动位数 = 7 - 0,再将搜索词向后移动7位,这里就不再重复了。

14.

下面介绍《部分匹配表》是如何产生的。

首先,要了解两个概念:"前缀"和"后缀"。 "前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。

15.

"部分匹配值"就是"前缀"和"后缀"的最长的共有元素的长度。以"ABCDABD"为例,

  - "A"的前缀和后缀都为空集,共有元素的长度为0;

  - "AB"的前缀为[A],后缀为[B],共有元素的长度为0;

  - "ABC"的前缀为[A, AB],后缀为[BC, C],共有元素的长度0;

  - "ABCD"的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0;

  - "ABCDA"的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为"A",长度为1;

  - "ABCDAB"的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为"AB",长度为2;

  - "ABCDABD"的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0。

16.

"部分匹配"的实质是,有时候,字符串头部和尾部会有重复。比如,"ABCDAB"之中有两个"AB",那么它的"部分匹配值"就是2("AB"的长度)。搜索词移动的时候,第一个"AB"向后移动4位(字符串长度-部分匹配值),就可以来到第二个"AB"的位置。


http://chatgpt.dhexx.cn/article/38HYrbWi.shtml

相关文章

什么是前缀索引?

一、什么是前缀索引? 所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快&#…

Motrix - 清爽开源免费的全能下载工具 (跨平台、支持 BT / 磁力链 / 百度网盘)

简介 Motrix 是一款开源免费且界面非常清爽简约的全能型下载软件,它跨平台支持 Windows、Mac、Linux 三大系统,可以支持下载 HTTP、FTP、BT、磁力链接以及下载百度网盘等资源 Motrix 软件界面非常简约清爽,个人认为设计上比较精美&#xff0…

一个功能齐全的 BitTorrent 库,支持 DHT、磁力链接、加密等功能

【公众号回复 “1024”,免费领取程序员赚钱实操经验】 大家好,我是章鱼猫。 今天给大家推荐三个不错的开源项目。 1、Bt 这是一个 Java 的 BitTorrent 库。支持 DHT、磁力链接、加密等功能的 Java 库,可以根据自己的喜好开发和定制 BT 工具&a…

前缀码详解

文章目录 提出问题作出假设进一步假设进一步思考进一步探索 (二叉树编码字符)拓展(二叉树解码位串) 提出问题 计算机常用 位串(一串0和1组成的字符串) 来表示各种字符。如果想要用0和1表示26个英文字母&am…

前缀和(一)

本文首发自本人微信公众号:今天你A了吗。每日算法讲解,面试题,冲刺BAT大厂。微信扫码关注吧: 前缀和(一)仅涉及一维前缀和。前缀和(二)涉及二维前缀和。 一、介绍:什么是…

115://开头的链接怎么转磁力?

115浏览器是一款体积小巧、启动速度快的多功能网页浏览器,最近有些用户就来咨询小编115://开头的链接要如何转磁力?下面小编就来给大家详细分析一下这个问题。 115://开头的链接转磁力方法介绍 1、首先打开 115 浏览器,然后在其右上角的&…

磁力链接文件服务器,什么是磁力链接(BT、磁力链这些词语是什么意思?)

“知其然知其所以然”。我们经常在下载资料的时候能看到BT、磁力链等词语,百思特网这些词语到底是什么意思呢? 下载都会用,但是你了解吗? BT下载 传统的下载模式是每个客户端从服务器拷贝文件,跟校园内常用的FTP一样。因为服务器宽带是一定的,所以下载的人越多下载速度会…

磁力链前缀

magnet:?xturn:btih:

磁力链接 结构解析 分享

磁力链接由一组参数组成,参数间的顺序没有讲究,其格式与在HTTP链接末尾的查询字符串相同。最常见的参数是"xt",是"exact topic"的缩写,通常是一个特定文件的内容散列函数值形成的URN,例如&#xf…

2021下半年最新编程培训机构排名出炉!

就目前的IT行业发展情况来看,市场对程序员的需求还是非常大的,参加编程培训对小白来说是一个不错的选择,毕竟在专业的编程培训机构学习,能够在短时间内掌握技术要领。如今的编程培训机构鱼龙混杂,教学质量也是参差不齐…

我,是一个培训班出来的程序员 | 程序员有话说

作者 l HeroMe 责编 | 伍杏玲 本文经授权转载自Hollis(ID:hollischuang) 这个城市的所有人都在忙碌的过生活,他们行色匆匆,车水马龙,他们认为时间就是金钱。 我在办公楼里俯视着他们,在这个…

培训机构毕业的程序员被歧视的背后逻辑

(注:本文曾发表于《程序员》2015.11.B期) 现在,像达内、华清远见、国嵌、北大青鸟、传播智客等等IT培训机构很多,为尚未毕业的大学生、毕业了一时找不到工作的大学生、工作后想转行的再就业者提供了一个掌握新技能的机…

为什么都瞧不起培训班出来的程序员?

培训机构出来的程序员怎么了? 不怎么,就是容易招偏见! 某培训机构毕业的程序员大雄,和同班同学,一起伪造学历和经验,被HR发现后,全部被开除了。 而我在北京某大型培训机构(以下简称“…

几张图告诉你程序员的残酷现状,培训机构出来的程序员可以吗

别只看不评论,谈谈你心中的程序员,感兴趣的话可以扫描左侧二维码 IT行业可以说在国内行业薪资排名中一直名列前茅,这也是为什么IT行业一直持续火爆的原因,随着前几年来的移动互联网热潮,催生了大量的Android开发岗位&…

为什么很多公司不要培训机构出来的程序员?

近几年,互联网创业潮让IT技术人员的需求大大增加,各类IT培训机构风生水起,办得如火如荼。然而,一些公司却招聘网站上写着”没有上过培训班的优先。“为什么会有这样的区别对待呢? 经过调查发现,培训机构出来的程序员被…

为什么很多公司不要从IT培训机构出来的程序员?

在很多平台看到这样的问题:为什么很多公司不要从IT培训机构出来的程序员?作为一名it培训行业从业者,我试着去了解和分析提出这种问题的人,其出发点和立场,并客观阐述个人对于这个问题的一些看法。 为什么有一些公司不…

如何看待培训机构出来的非科班程序员

看着身边的同学和朋友的情况,有感而发,打算从各方面角度说一说这件事。 近几年,互联网创业潮让IT技术人员的需求大大增加,各类IT培训机构风生水起,办得如火如荼。大多培训机构都是以保底工资nk,年薪轻松上…

程序员编程培训

作为公认的屌丝逆袭最佳途径,程序员一度成为一个非常吃香的职业。因为这是一个不太看重学历和性别的行业,只要你技术过关,就不愁没工作。那么如何才能成为一位合格的程序员呢?除了大学专业是计算机之外,报培训班或许是…

从培训机构出来的程序员,后来都怎么样了?

Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 知乎上有这样一个问题,培训班程序员几个月出来就月薪过万,那为什么我们还要花四年时间上大学? 乍一…

从培训机构出来的程序员,后来都怎么样了? | 程序员有话说

作者 | 素年清时 责编 | 伍杏玲 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw 【程序人生 编者按】随着互联网的大火,各大城市催生了一个又一个的培训班,每年以批量生产的模式向社会输送…