KMP(Knuth-Morris-Pratt )算法-模式串lps(Longest Prefix Suffix)最长相同前后缀长度数组算法证明

news/2025/11/15 2:23:18/文章来源:https://www.cnblogs.com/lvjianwei/p/19223980

KMP(Knuth-Morris-Pratt )算法-模式串lps(Longest Prefix Suffix)最长相同前后缀长度数组算法证明

被KMP算法折磨了几天,在chatgpt的帮助下终于了解了lps数组,或者叫next数组计算过程中非常关键点的原理,这里着重在证明为什么这样计算。

 1 public static int[] buildLPS(String pat) {
 2     int n = pat.length();
 3     int[] lps = new int[n];
 4 
 5     int prefixLen = 0; // 当前已匹配的最长前后缀长度
 6     int i = 1;         // 正在处理 lps[i]
 7 
 8     while (i < n) {
 9         if (pat.charAt(i) == pat.charAt(prefixLen)) {
10             prefixLen++;
11             lps[i] = prefixLen;
12             i++;
13         } else if (prefixLen > 0) {
14             // 需要证明的部分
15             prefixLen = lps[prefixLen - 1];
16         } else {
17             lps[i] = 0;
18             i++;
19         }
20     }
21     return lps;
22 }

 

以上是计算lps数组的方法,lps数组表示了位于当前坐标i时,pat[0...i]中最长相同前后缀的长度。

line 9-13 说明了当pat[i] = pat[prelen]的时候,只需要继续沿用之前的最长前后缀长度就可以了

难点在理解line 15 为什么回退的时候 prefixLen=lps[prefixLen-1]而不是其他的值。以下是是证明过程:

当前len = lps[i-1],及pat[0..i-1]的最长相同前后缀长度,及pat[0...len-1] = pat[i-len..i-1]。

当pat[len] != pat[i]时,表示不能继续沿用之前的len = lps[i-1],

而是需要重新寻找一个t,满足pat[0...t-1]+pat[t] = pat[i-t...i-1]+pat[i],相当于pat[0...t-1] = pat[i-t...i-1],根据lps定义,及我们需要找一个pat[0...i-1]的长度为t且相同的前后缀。

已知len=lps[i-1]是不满足条件的,所以t<len。

目前

1. pat[0...len-1] = pat[i-len..i-1]

2. pat[0...t-1] = pat[i-t...i-1]

3. t<len

可知

pat[0...t-1]+pat[t..len-1] =pat[i-len..i-t-1]+pat[i-t...i-1]

由此可得 pat[i-t...i-1] (长度t) 是pat[0...len-1] = pat[0...t-1]+pat[t..len-1] 的后缀

又因为pat[0...t-1](长度t) 是pat[0...len-1] 的前缀

所以t是pat[0...len-1]的某一个相同的前后缀的长度。

t的最大值是lps[len-1], 及pat[0..len-1]的最长相同前后缀长度。

 

一个比较好体现这个过程的例子:aabaabaaa

lps是 [0, 1, 0, 1, 2, 3, 4, 5, 2]

 

image

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Universal Flip Key Remote KD NB59-3 – 5-Pack for Easy Car Key Replacement

Today were featuring an excellent product: **KEYDIY KD NB59-3 Universal Flip Remote Key 3 Buttons 5pcs/lot**. **KEYDIY KD NB59-3 Universal Flip Remote Key 3 Buttons 5pcs/lot** This tool is designed to …

Autel MK900TS: Advanced Wireless TPMS Scanner with Android 11 40+ Services

Today were featuring an excellent product: **Autel MaxiCOM MK900TS MK900-TS Wireless TPMS Diagnostic Scanner with Android 11 Support DoIP/CAN FD Protocols and 40+ Services Upgraded of MK808TS**. **Aute…

RimWorld 断点调试——第一回

本文记录了一种能逐步调试 RimWorld Mod 代码的方法。众所周知,写 RimWorld Mod 时,没法儿直接对代码进行断点调试,那如何才能实现这个功能就成为了一个问题。现在介绍我第一个成功使用的办法。该方法依赖 Windows …

gateway网关实现路由基于nacos注册中心

首先你需要启动nacos服务,才能开始下面的效果 这里10010为网关端口 nacos你需要当服务都启动后,你应该看到如下服务 好了,下面开始上代码了 首先是网关部分<project xmlns="http://maven.apache.org/POM/…

Upgrade Your Diagnostics with OTOFIX VCI V1 Bluetooth Connector for Seamless Scanning

Today were featuring an excellent product: **OTOFIX VCI V1 Bluetooth Connector Used with OTOFIX Diagnostic Tablets D1, D1 Lite, D1 Pro, D1 MAX, D1 Plus, IM1, BT1**. **OTOFIX VCI V1 is a VCI (Vehicle Co…

Unlock BOSCH MPC5xx ECU Data with CG FC200 Programmer – Bench Read/Write Tool

Today were featuring an excellent product: **CG FC200 ECU Programmer Full Version with MPC5XX Adapter for BOSCH MPC5xx Read/Write Data on Bench**. **CG FC200 ECU Programmer Full VersionWith MPC5XX Adap…

2025 Autel IM608 PRO II Full Kit – Advanced Diagnostics with Free G-Box3

Today were featuring an excellent product: **2025 Autel MaxiIM IM608 PRO II (Autel IM608 II) Full Kit with JVCI+ Plus IMKPA Accessories Get Free G-Box3 APB112**. **Autel MaxiIM IM608 PRO II (IM608S II)…

Python 在 Windows 上提示文本消息的实现(模拟安卓手机上的 Toast 效果)

用 tkinter 实现,在桌面上即时显示文字消息(置顶显示、可拖动),经过 duration 毫秒后消失。 效果演示:代码实现:"""使用方法: toast(message_text, bg="#075077", duration=3000)&quo…

小红书-强共鸣、高热度的话题----每一个都精准命中测试员的日常,非常适合在小红书打造“测试职场达人”人设。

1、 类似“被老板问:这个问题为什么没有测试出来?”的热门话题还有哪些?请结合软测职场高频场景(面试压力提问、工作追责、能力考察),整理排名靠前的 20 个热门话题,贴合真实职场痛点,适配小红书 “强共鸣 + 干…

每日一导4

Problem 已知函数 $ g(x) =\sin x $ , 点列 $ A_n( 2^{-n} , g(2^{-n} ) ) \hspace {0.2cm} (n\in N^*) $ . 设直线 $ A_nA_{n+1} $ 斜率为 $ k_n$ ,求证: $ \sum_{i=1}^{n}k_i >n-\frac{1}{9} $ .分析 原题前面的…

基于FPGA的BPSK+costas环实现,包含testbench,高斯信道,误码统计,可设置SNR

1.算法仿真效果 加入频偏:设置SNR=30db(无误码,上图中误码个数8为costas锁定过程中带来的) 设置SNR=15db(无误码,上图中误码个数8为costas锁定过程中带来的) 设置SNR=5db (误码2400个测试符号,错误30个,其中…

一个基于 .NET 8 + DDD 搭建的模块化微服务框架

前言 今天大姚给大家分享一个基于 .NET 8 + DDD 搭建的模块化微服务框架:NetCoreKevin。 项目介绍 NetCoreKevin 是一个基于 .NET 8 + DDD 搭建的模块化微服务框架,其模块化设计使得每个功能都可以独立引用,非常适…

【硬件测试】基于FPGA的BPSK+costas环系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR

1.算法硬件测试效果 vio设置SNR=30 vio设置SNR=8硬件测试操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 Costas环是一种用于载波同步的常见方法,特别是在调制解调中,它被广泛用于解调相位调制信号,如…

### 4

4.4 切口效应 由于表面切口应力集中效应导致应力水平增加,典型的零件疲劳失效通常发生在表面上的切口处。切口被定义为几何上的不连续,是由设计(如一个孔)或加工工艺引入的(以材料和制造缺陷的形式出现,如夹杂、…

每日一句

没做一件事,我们首先想到的就是别人会怎样看,人生中几乎有一半的麻烦与困扰就是来自我们对行动结果的焦虑上。 ———— 叔本华

4.3 基于极限拉伸强度估算零件S-N曲线

4.3 基于极限拉伸强度估算零件S-N曲线 在没有S-N实验数据可用时,零件S-N特性的估算方法对于设计过程是非常有用而且至关重要的。本节重点介绍根据有限的信息估算S-N曲线的方法,素材主要取自大量的参考文献 [16] [3] …

2025年宁夏AI客服服务商/供应商最新top5专业推荐:智能交互重构企业服务新范式

随着AI技术深度赋能服务领域,具备多模态交互能力的智能客服已成为企业降本增效的核心工具。本榜单基于技术创新性、场景适配度、服务效能三大维度,结合宁夏本地企业数字化转型需求,深度解析四家头部服务商综合实力,…

Windows 文件删除命令详解

1. rmdir - 删除目录命令 基本语法 rmdir [参数] 目录名主要参数说明参数 作用 等效 Linux 命令/s 递归删除目录树(包含子目录和文件) rm -r/q 安静模式(不提示确认) rm -f常用组合 # 基本删除(只能删除空文件夹)…

Polander is good.

only woman such as name as Marie Curie

2025年宁夏智能体定制服务商专业评测:智能体重构企业服务新生态

随着人工智能技术的飞速发展,AI智能体定制服务成为推动企业数字化转型的核心力量。本榜单基于技术实力、行业适配性、服务效能三大维度,结合市场反馈和实际案例,对宁夏地区的AI智能体定制服务商进行综合评测,为企业…