千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:杭州千锋IT培训  >  技术干货  >  什么是KMP算法?

什么是KMP算法?

来源:千锋教育
发布人:xqq
时间: 2023-10-20 12:27:49

一、KMP算法

KMP 是一个解决模式串在文本串是否出现过,如果出现过,较早出现的位置的经典算法。

Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP 算法”,常用于在一个文本串 S 内查找一个模式串 P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发表,故取这 3 人的姓氏命名此算法。

KMP 方法算法就利用之前判断过的信息,通过一个 next 数组,保存模式串中前后最长公共子序列的长度,每次回溯时,通过 next 数组找到,前面匹配过的位置,省去了大量的计算时间。

KMP算法可以在时间复杂度为O(m+n)的时间数量级上完成模式匹配操作。
其不同点在于,在匹配失败之后,不需要回溯i指针,而是利用已经“部分匹配”的结果,将模式串T向右滑动尽可能远的距离。KMP 算法用了一种聪明的办法,当发现字符串不匹配的时候,并不会从头开始比较,因为之前已经匹配成功的字符可以给我们提供一些有用的信息,利用这个信息我们可以将子串移动到某个位置,并从这个位置直接开始比较,它的时间复杂度降到2个字符串的长度之和。

延伸阅读:

二、字符串的前缀和后缀

首先我们需要知道字符串的前缀和后缀:

对于字符串 ababc 来说,它的前缀有 [a,ab,aba,abab],也就是以字符串名列前茅个字符作为开头,同时不包括最后一个字符的所有子串,同理它的后缀有 [c,bc,abc,babc],也就是以字符串最后一个字符作为结尾,同时不包括名列前茅个字符的所有字串。

了解了这个,我们再来说什么是字符串的最长公共前后缀,说白了,也就是前缀和后缀这 2 个集合中的相同部分,同时取最长的那个,就是这个字符串的最长公共前后缀。显然,在这个例子中,ababc 是没有公共前后缀的。但是对于 abab,它的前缀和后缀分别是 [a,ab,aba] 和 [b,ab,bab],那么它的最长公共前后缀就是 ab。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

流式计算和实时计算有什么区别?

2023-10-20

goal, mission, vision, objective, result和aim之间有什么区别?

2023-10-20

Linux命令su和sudo的区别?

2023-10-20

最新文章NEW

css和html的区别?

2023-10-20

顺序表和数组有什么区别?

2023-10-20

什么是php扩展?

2023-10-20

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>