尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

20251110 - KMP

20251110 - KMP
📅 发布时间:2026/6/20 0:07:18

前言

我今天生日!!!

由来

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 函数)

相关新闻

  • 2025年11月智能洗碗机型号推荐榜:麦浪5000plus+领衔全维度对比
  • 2025年11月小户型油烟机型号推荐榜:五款热销机型全维度对比
  • 2025年11月大容量洗碗机型号推荐榜:市场主流机型横向对比解析

最新新闻

  • 2026杭州防水补漏维修团队实测盘点TOP4:杭州业主房屋渗漏修缮靠谱选择 - 宅安选房屋修缮
  • 为什么选择ChatTutor?传统聊天机器人无法比拟的5大核心优势
  • ieBetter.js高级技巧:如何扩展自定义API到旧版IE浏览器
  • 桌面自动化数字员工搭建 OpenClaw 2.7.9 全套落地操作文档(包含安装包)
  • LSPatch:免Root实现Android应用功能扩展的终极方案
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号