KMP算法详解

什么是KMP算法

1. 名字含义

KMP算法全称Knuth-Morris-Pratt算法 ,取自三位发明者------D.E. Knuth(高德纳)、J.H. Morris(莫里斯)和V.R. Pratt(普拉特)------姓氏的首字母。这三位计算机科学家于1977年联合提出了这一算法。

2. 算法功能

简单说,KMP算法就是用来解决"在一大段文字里快速找到某个关键词"的问题。

如果用大白话来讲它的运作方式,可以这样理解:

普通的暴力匹配,是一个字一个字地挪动关键词,每次对不上了,就退回起点,把关键词整体往右挪一位,从头再比,像一把"死板"的尺子。

而KMP算法 ,则是一把"聪明"的尺子。它会在匹配之前先"打量"一下关键词内部的重复规律。当遇到对不上的字符时,它不会只挪一位 ,而是利用提前记下的规律,一次跳跃好几格,直接跳过那些"用脚想都知道肯定配不上"的位置。整个过程主串的指针一直往前走,从不回退。

3. 意义

KMP算法的出现,把字符串匹配的效率从"一个位置一个位置笨拙地挪"提升到了"跳跃式前进"的智慧层面。

最坏情况下:

  • 朴素字符串匹配算法(暴力匹配):时间复杂度为 O(n×m)
  • KMP算法:时间复杂度为O(n+m)

可见KMP极大程度优化了字符串匹配这件事,让计算机在处理海量文本或长关键词时能节省大量时间。更重要的是,它所蕴含的"利用已知信息避免重复劳动"的思想,成为了算法优化领域的一盏指明灯。

4. 相关名词解释

如下图所示,给了一个例子,让我们在"sadbutsad"这个字符串中,寻找"sad"这个子字符串第一次出现的下标,此时:

  • 主串:就是"sadbutsad"
  • 子串:就是"sad"

5. 举例

主串:

子串(也叫"模式串"):

  • 暴力匹配的做法
  • KMP的做法

解题详细步骤

1. 根据子串,求出next数组(next数组只由子串决定,和主串无关)

上题中,子串ABABC的next数组为0, 1, 1, 2, 3

求这个,需要了解一下**"最长前后缀**"这个概念

举例:

实战案例

待完善

相关推荐
positive_zpc3 小时前
进阶数据结构图——关键路径(四)
数据结构·图论·关键路径
孙克旭_3 小时前
单链表进阶实操:5 道常考面试题详细解析【Java 实现】
java·开发语言·数据结构·单链表
Chester_19994 小时前
CSP202206C.角色授权
开发语言·数据结构·c++·蓝桥杯
旖旎夜光5 小时前
LeetCode 238:除自身以外数组的乘积(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和
一条大祥脚5 小时前
26杭电暑期第八场(后半)快读|快写|tarjan|路径DP|mex转化|扫描线|前缀和|二分图
数据结构·算法·tarjan·杭电多校·强联通分量·动态规划dp
Chester_199913 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
专注仿真18 小时前
Spring AI 实现智能对话系统项目指南
数据结构·spring·机器学习
间歇性努力持续性发呆的野生快乐选手19 小时前
高级数据结构:树状数组
数据结构
每周报刊1 天前
竞速座舱级视界:爱攻 AGP497UCZD 超宽 QDOLED 显示器解析
数据结构·游戏·计算机外设