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

算法(④KMP)

KMP 算法的核心原理

利用模式串自身的“对称性”进行跳跃。

这个“对称性”就是我们之前提到的最长公共前后缀

当匹配失败时,KMP 算法不会从头再来,而是会利用已经匹配成功的部分信息,直接将模式串移动到下一个最可能匹配的位置。

好的,我们来详细计算 ABABABC 这个模式串的部分匹配表(LPS 表)。

什么是部分匹配表?

部分匹配表记录了模式串中,以每个字符结尾的子串的最长公共前后缀的长度。这个表就是 KMP 算法的“导航图”。


计算过程

我们从左到右,一步步计算每个位置的值。

模式串 (P)ABABABC
索引0123456
子串AABABAABABABABAABABABABABABC
LPS 值???????

导出到 Google 表格

1. 子串 A (索引 0)

  • 前缀:空

  • 后缀:空

  • 最长公共前后缀长度:0

2. 子串 AB (索引 1)

  • 前缀:A

  • 后缀:B

  • 没有公共部分。

  • 最长公共前后缀长度:0

3. 子串 ABA (索引 2)

  • 前缀:A, AB

  • 后缀:A, BA

  • 最长公共部分是 A

  • 最长公共前后缀长度:1

4. 子串 ABAB (索引 3)

  • 前缀:A, AB, ABA

  • 后缀:B, AB, BAB

  • 最长公共部分是 AB

  • 最长公共前后缀长度:2

5. 子串 ABABA (索引 4)

  • 前缀:A, AB, ABA, ABAB

  • 后缀:A, BA, ABA, BABA

  • 最长公共部分是 ABA

  • 最长公共前后缀长度:3

6. 子串 ABABAB (索引 5)

  • 前缀:A, AB, ABA, ABAB, ABABA

  • 后缀:B, AB, BAB, ABAB, BABAB

  • 最长公共部分是 ABAB

  • 最长公共前后缀长度:4

7. 子串 ABABABC (索引 6)

  • 前缀:A, AB, ABA, ABAB, ABABA, ABABAB

  • 后缀:C, BC, ABC, BABC, ABABC, BABABC

  • 没有公共部分。

  • 最长公共前后缀长度:0


最终的部分匹配表

经过计算,我们得到了完整的 LPS 表:

模式串 (P)ABABABC
LPS 值0012340

http://www.xdnf.cn/news/19193.html

相关文章:

  • 基于YOLO8的垃圾识别检测系统(数据集+源码+文章)
  • (双指针)Leetcode283.移动零-替换数字类别+Leetcode15. 三数之和
  • day44-Ansible变量
  • ESP32C3和ESP32S3的区别有哪些?该怎么选型?
  • React Router 6 获取路由参数
  • 无人机也能称重?电力巡检称重传感器安装与使用指南
  • 算法之x数之和
  • B树与B+树的原理区别应用
  • 第12章:推荐算法与实践
  • 揭开智能体架构面纱:90% 属软件工程,10% 为 AI 技术
  • nginx(自写)
  • 微服务搭建(SpringBoot + Dubbo + Nacos)
  • vue+Django 双推荐算法旅游大数据可视化系统Echarts mysql数据库 带爬虫
  • 【学Python自动化】 4. Python 控制流与函数学习笔记
  • 嵌入式Linux驱动开发:ICM20608六轴传感器SPI驱动
  • 深度学习核心损失函数详解:交叉熵、MSE、对比学习(InfoNCE)
  • 科技感网页计时器.html
  • Linux系统统计用户登录和注销时间的工具之ac
  • 【计算机408计算机网络】第四章:自底向上五层模型之网络层
  • 使用python格式化nginx配置文件
  • OSI与TCP/IP各层功能详解
  • 吴恩达机器学习作业八:SVM支持向量机
  • 从零开始的python学习——注释与运算符
  • 机器学习 - Kaggle项目实践(6)Dogs vs. Cats Redux: Kernels Edition 猫狗二分类
  • 【Android】OkHttp发起GET请求 POST请求
  • 「从 0 到 1」的 Python-requests 爬虫完整教程
  • 内网后渗透攻击--跨域攻击
  • for in+逻辑表达式 生成迭代对象,最后转化为列表 ——注意list是生成器转化为列表,但[生成器]得到的就是一个列表,其中包含一个生成器元素
  • 字节跳动出品的 AI开发工具 : Trae:开启 AI 编程新时代
  • 解读IEC 62477-2-2018