当前位置: 首页 > news >正文

20251110 - KMP

前言

我今天生日!!!

由来

KMP 算法,是由 Knuth、Pratt 和 Morris 三位巨佬发布的一个算法。

他可以在线性(说人话就是 \(O(n + m)\) )时间复杂度内在字符串中查找子串

思想

朴素算法:

枚举每一个元素,然后从这一位开始不断向后比较,每次比较失败之后都要从上一次匹配的位置的下一个位置开始重新比对,最好时间复杂度是 \(O(n+m)\) 的,但是如果子串比较靠后或者匹配失败比较多,最坏可以卡到 \(O(nm)\) 的。

字符串哈希

朴素算法的慢,是因为判定子串和截取的原串的时间复杂度是 \(O(m)\) 的,有不有什么方法可以使判断子串的时间复杂度变成 \(O(1)\) 呢?

我知道,字符串哈希。

预处理出哈希表,之后再查一查就好了。

时间复杂度\(O(n+m)\)

正确率\(\ge 95\%\)。(话说 dzl 十哈希被卡了?)

KMP

如果能让指针 \(i\) 不后退,就能让时间复杂度优化成 \(O(n + m)\)

字串:abcab
原串:abcacababcab

首先看看 \(a[i+1]\) 是否等于 \(b[j + 1]\),如果是,\(i\)\(j\) 都加 \(1\)

否则找到一个 \(k\),使得 \(b[1] \sim b[k] = a[i - k + 1] \sim b[n]\),跳回 \(k+1\) 这个位置。

依次匹配下去。

next 数组

KMP 的精髓在 \(next\) 数组上。

\(a[i] == a[j + 1] \ (1 \le i \le n,0 \le j \le n)\) 时,\(i\)\(j\) 都加 \(1\)

否则查一查 \(next\) 数组,考虑更小的区间,反复跳回直到可以再次进行操作的位置,这就是 \(next\) 数组的处理法。

历史背景

KMP 算法由 Donald Knuth、James H. Morris和Vaughan Pratt 三位巨佬于 \(1977\) 年联合发明。该算法的名称来源于这三位科学家的姓氏首字母。KMP 算法的发明背景源于当时计算机资源稀缺,特别是在进行大文本字符查找时,响应时间过长,无法充分利用计算资源。

例题

1.[【模板】KMP](P3375 【模板】KMP - 洛谷)

模版题,代码如下:

void init_next(){int j = 0;nxt[1] = 0;for(int i = 2;i <= n;i++){while(j > 0 && b[i] != b[j + 1]){j = nxt[j];}if(b[i] == b[j + 1]) j++;nxt[i] = j;}
}
void solve(){init_next();int i = 0,j = 0;for(;i <= n;i++){while(j > 0 && a[i] != b[j + 1]){j = nxt[j];}if(a[i] == b[j + 1]){j++;}if(j == m){printf("%d\n",i - m + 1);j = nxt[j];}}for(int i = 1;i <= n;i++)printf("%d ",nxt[i]);
}

2.[[BalticOI 2009] Radio Transmission 无线传输]([P4391 BalticOI 2009] Radio Transmission 无线传输 - 洛谷)

思路:求出字符串的 \(next\),用 \(n - next[n]\)

证明:从字符串的某一处开始到串末,和串首到某一处是完全相等的,其中最长的就是最长公共前后缀。

所以,答案就为 \(n - next[n]\)

代码:

void solve(){printf("%d\n",n - next[n]);
}

后记

KMP 难在 \(next\) 数组上,考点也在 \(next\) 数组上,所以,还是好好学习 KMP 吧!(用 find 函数

http://www.jsqmd.com/news/36891/

相关文章:

  • 个人服务器无法连接外网的设置问题(LINUX,NMCLI)
  • 2025年11月智能洗碗机型号推荐榜:麦浪5000plus+领衔全维度对比
  • CF1485F Copy or Prefix Sum 分析
  • 在电脑上操作手机,并把手机黑屏 - 昵
  • 2025年11月小户型油烟机型号推荐榜:五款热销机型全维度对比
  • 教务管理系统开发博客
  • 2025年11月智能油烟机型号推荐对比:五强机型性能参数全解析榜
  • 2025年11月大容量洗碗机型号推荐榜:市场主流机型横向对比解析
  • 2025年11月大容量洗碗机型号评价榜:家庭聚会场景下的优选排行
  • 2025年11月除菌洗碗机型号对比榜:权威数据看懂五星机型差异
  • 2025年11月除菌洗碗机型号推荐榜:五款高除菌率机型对比评价
  • 如何确保安全的就是​HTTPS
  • Paytium 3.0.13 WordPress插件存储型XSS漏洞分析
  • 使用爬虫技术抓取网站数据的方法和工具
  • Spring Cloud Alibaba + SkyWalking
  • 改题
  • 20232419 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • MacX DVD Ripper Pro for Mac v6.8.2 安装教程|MacDVD转换软件怎么安装?
  • 日志 | 2025.11
  • 完整教程:【C++】继承(1)
  • CSP2025 T4 employ
  • 2025/11/10
  • VSCode下载安装和使用教程(附安装包,适合新手)
  • 电脑同时获取了一个正常IP和一个169开头的IP
  • 【Agent】生成式隐式记忆 MemGen 源码解读
  • 高级语言程序第四次作业 - 102300317
  • 2025年草莓速冻冷库企业推荐排行榜
  • 基于单片机拖尾式多模式流水灯系统仿真设计 - 详解
  • 2025年3000卫生纸加工设备推荐排行
  • 项目管理系统开发指导