从最直观的逻辑看一下KMP算法

配电变压器测控终端装置设计 配电变压器测控终端装置在电网运行中承担着数据采集、状态监测、故障预警及远程控制的关键任务,其性能直接关系到配电系统的安全性与可靠性。本研究围绕测控终端的硬件电路、软件算法、通信系统及系统优化展开深入分析,并基于实验测试验证系统性能。硬件设计包括模拟量输入电路、电压电流信号变换电路、A/D转换电路、控制与通信电路及系统电源电路,确保信号采集的高精度与系统的稳定性。软件部分涵盖系统控制程序、数据采集与处理程序、通信程序及显示与控制程序,实现数据的实时处理与传输。通信模块结合RS-485、CAN总线及以太网技术, 阅读详情

有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢,KMP算法就是一种方法,看下图:

如果使用暴力匹配 ,假如S(x)-S(k)对应P(0)-P(k-x)的部分都相同(此处约定:S(n)代表字符串S中第n个字符,-代表到的意思,并非减),但是S(k+1)不等于P(k+1-x),则需要继续比较S(x+1)是否等于P(0),真的只能这样比较么,当然不是。

看KMP:假如在字符串S中S(x)-S(y)和S(z)-S(k)相同(此时S(x)-S(y)就是在字符串S(x)-S(k)中的最大长度的相同前缀后缀),如果S(k+1)不等于P(k+1-x),只需要比较P(y+1-x)和S(k+1)是否相等即可。接下来证明为什么在此区间不会有可以匹配成功的可能:

假如S(x)-S(z)中存在从P开头一直相等到S(k)的字符串,设为S(n),则S(n)-S(k)必须完全等于P从开头的等长部分,所以S(x)-S(k)中的最大长度的相同前缀后缀就应该是S(n)-S(k),而不是S(z)-S(k),所以不成立。

证明完事了,说一下算法,我从网上粘贴了一个获取next数组的算法(next数组是啥可以看这篇文章https://www.cnblogs.com/zhangtianq/p/5839909.html,很长,我只是觉得其中next数组说的很详细,别的我也没看0.0):

public static int[] getNext(String ps) {

    char[] p = ps.toCharArray();

    int[] next = new int[p.length];

    next[0] = -1;

    int j = 0;

    int k = -1;

    while (j < p.length - 1) {

       if (k == -1 || p[j] == p[k]) {

           next[++j] = ++k;

       } else {

           k = next[k];

       }

    }

    return next;

}

对比着下图理解上边逻辑:

第一次循环k=-1,j=0,next[1]=0,没啥说的,假设ps的前n个字符都不同,根据代码推算一下你就知道,他们对应的next数组中的值都会被赋予0,而k就会在-1和0中变化,j是字符串下标,是一直在增加的。

当首次出现等于字符串首字符(上例中为A)时,即p[j] == p[k](k=0),之后k和j都自增,当出现第一个不相等的字符时,看图,当k=2,j=4时,此时k应该回溯到什么位置:

注意,这是重点!!!

此时ABA和ABC已经失匹配,那k回到哪才可能继续匹配呢,答案是ABA这个字符串去掉最后一个字符(A)之后,所得到的字符串中最大长度的相同前缀后缀的前缀串的下一个字符的位置。这句话有点绕,看例子说明:

当j到C的下标位置时,ABA和ABC已经失匹配,k应该回溯到AB这个字符串中最大长度的相同前缀后缀的前缀串的下一个字符的位置,也就是第三个字符A对应的next数组中的值,即0;当j到D的下标位置时,ABABC和ABABD已经失匹配,k应该回溯到第一个ABAB中最大长度的相同前缀后缀的前缀串的下一个字符的位置,也就是C对应的next数组中的值,即2。

还是绕口的话,这么说吧,当j到D的下标位置时,ABABC和ABABD已经失匹配,如果D还有可能匹配,它一定是匹配第一个AB之后的这个字符,因为之前匹配过的串(ABAB)中AB是最长的前缀后缀相同的串,AB已经不用再匹配了,所以用D跟第三个字符A比较即可,当然不相等,然后k会变成next[2]也就是0,之后的逻辑就很清楚了。

其实这个逻辑很简单,就是遇到一个字符不匹配了,那我必须去找之前匹配过的最长前缀后缀的串的下一个字符跟他比较,如果还是不一样,继续在这个最长前缀中找最长前缀后缀的那个串,如此反复,缕缕就好了,这个想通了之后,真的挺简单的。

如果有理解错误,恳请指正,谢谢

一文详解声码器 声码器(Vocoder)是语音信号处理领域的核心技术,其本质是通过“分析 - 参数化 - 合成” 的闭环流程,实现语音的高效编码、转换或生成。它不仅是早期语音通信的关键工具,更是现代 AI 语音技术(如 TTS、语音转换)的核心组件。以下从原理、技术分类、关键模块、应用及发展趋势展开详细解析。 阅读详情

相关推荐

【位运算进阶之----右移(>>)】

😄嘻嘻,朋友们,大家好!昨天我们学习了左移,今天我们来谈谈右移>>。⭐️简单来说,,也就是去掉一个数的二进制表达的末位,右移一位就去掉一位,右移两位就去掉两位。下面就让我们来详细看看吧!

weixin_73453526的博客 8931

KMP 算法详解

KMP算法是一种高效的字符串匹配算法,算法名称取自于三位共同发明人名字的首字母组合。该算法的主要使用场景就是在字符串(也叫主串)中的模式串(也叫子串)定位问题,常见的有“求子串出现的起始位置”、“求子串的出现次数”等。

这里是阿安的博客 5万+

单片机OTA升级:Bootloader如何多重校验保障APP完整性?

本文详细介绍了单片机OTA升级中Bootloader如何通过CRC校验、数字签名、版本比对和存储位置检查等多重校验机制保障APP完整性。CRC校验作为快速检测数据完整性的核心手段,结合其他安全措施有效防止设备变砖和安全漏洞,确保远程升级的可靠性。

l3m4n的博客 981

KMP算法原理详解

KMP算法是一种高效字符串匹配算法,通过预处理模式串构建next数组(记录最长公共前后缀长度),在匹配失败时利用已匹配信息跳过无效比较,将时间复杂度优化至O(n+m)。算法核心包括:计算next数组(动态规划)、匹配时保持文本指针不回溯、通过next值跳转优化。适用于文本编辑、基因比对等场景,相比朴素算法显著提升匹配效率。实现关键在于next数组的优化计算和匹配过程的指针跳转策略。

liulilittle的博客 2091

大模型辅助意图识别,更懂你的客户洞察平台

通过大量的学习和训练,大模型不仅具备庞大的知识库,更掌握着丰富的语言模式和语义规则,能够精准地理解每一段对话的含义,为每一通对话进行全面、准确的标注。主要来自客户的行为信息,将客户与机构的重要时刻以时间轴的方式呈现出来,掌握客户生命周期的完整脉络,识别一些容易被忽略的重要营销MOT(Moment Of Truth,关键时刻研究)机会,提示理财经理跟进处理。将客户的历史交易数据和埋点系统采集的客户行为数据结合起来,辅以部分内容资讯的偏好探测,综合分析和预测客户在各个维度的喜好程度,实现千人千面的客户推送。

Dezhuzhineng的博客 2157

山东大学机器学习(实验一内容)——线性回归

1. 描述 第一个练习将为你提供线性回归练习。这些练习已经用Matlab进行了广泛的测试,但它们也应该在Octave中工作,它被称为“免费版的Matlab”。如果你使用的是Octave,那就是 一定要安装Image包(可在Windows中作为选项使用)安装程序,可从Octave-Forge获得Linux。 2.线性回归 回想一下,线性回归模型是 hθ(x)=θTx=∑j=0nθjxj h_{\th...

HachiLin的博客 4108

详解kmp算法

1.朴素模式匹配 1.1基本思想: 从主串test 和子串pattern 的第一个字符开始,将两字符串的字符一一比对,如果出现某个字符不匹配,主串回溯到第二个字符,子串回溯到第一个字符再进行一一比对。如果出现某个字符不匹配,主串回溯到第三个字符,子串回溯到第一个字符再进行一一比对…循环一直到子串字符全部匹配成功。 1.2例如: 第一次:不匹配 第二次:主串从第2个字符,模式串从头开始,直到b与c不匹配 第三次:主串从第3个位置开始,模式串从头开始,a与c...

qq_51950769的博客 7346

疾风气象大模型4.0白皮书

《疾风气象大模型白皮书摘要》 疾风气象大模型(J-AFM)是国内首个基于3D建模的气象智能平台,突破传统二维气象分析的局限,采用体素化技术构建"x-y-z-t"四维统一模型,实现从分钟级短临到30天跨时效的连续预测。核心技术包括:1)多源数据三维同化,融合雷达、卫星、风廓线等异构数据;2)物理约束AI解码器,嵌入能量守恒、湍流封闭等气象原理;3)行业适配插件,服务风电、光伏、航空等领域,如山地风场尾流校正、云影短临预测。平台支持批流一体推理与边缘部署,提供概率化输出和误差溯源能力,显著降

专注AI大模型,软件混淆,授权 540

KMP算法基本原理

KMP算法基本原理 KMP算法是根据三位作者(D.E.Knuth,J.H.Morris和V.R.Pratt)的名字来命名的,算法的全称是Knuth Morris Pratt算法,简称为KMP算法。 KMP算法的核心思想,跟上一节讲的BM算法非常相近。我们假设主串是a,模式串是b。在模式串与主串匹配的过程中,当遇到不可匹配的字符的时候,我们希望 找到一些规律,可以将模式串往后多滑动几位,跳过那些肯...

qq_43954210的博客 3082

ESM2蛋白预训练模型 蛋白质、氨基酸向量表示

参考: https://github.com/facebookresearch/esm https://huggingface.co/facebook/esm2_t33_650M_UR50D https://esmatlas.com/resources?action=fold tokenizer_对输入蛋白会头尾添加cls、eos特殊字符,占两个字符长度 参考:https://github.com/facebookresearch/esm 直接clone下来代码

weixin_42357472的博客 1万+

基于YOLOv8的违规抽烟/打电话检测系统:从数据集构建到部署实战

模型优点缺点精度高速度慢(5 FPS)SSD速度快小目标检测差YOLOv5平衡性好官方支持停止YOLOv8最新、最快、最准需要PyTorch环境YOLOv8相比前代:骨干网络升级(C2f模块)无锚框检测(Anchor-Free)动态任务对齐分配(TaskAlignedAssigner)支持分类/检测/分割/姿态估计。

YOLO 98

简单的讲懂KMP算法(配图最细保姆级手把手教会!!)

KMP 算法(Knuth-Morris-Pratt 算法)是一种高效的字符串匹配算法,他比较BF算法复杂度更低但是也更难理解,它的算法非常精妙减少了BF算法(暴力算法,上一篇博客有讲解)的无用重复操作大大减少了循环次数,再加上限制条件使得它的效率更加高效,我有看到许多大神在讲KMP算法但是大部分都是理论性讲述,不易懂打退了许多学者的热情以及自信心,我将会保姆级和大家分析KMP算法的思想以及代码的实现!!!

weixin_63426509的博客 6275

地平线J6的基础简介

地平线J6M芯片:面向中阶辅助驾驶市场的高性价比芯片

weixin_43084908的博客 4452

KMP算法详解

KMP算法

weixin_45746505的博客 3万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【KMP算法】KMP算法揭秘:高效字符串匹配的艺术

KMP算法的讲解及应用

2403_87459748的博客 1619

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了

我们在一个母字符串中查找一个子字符串有很多方法。KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度。 当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容。   在KMP

Shawn的专栏 7万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

KMP算法

通俗易懂地介绍了kmp

PGeorge6的博客 2871

KMP算法啊啊啊

KMP算法问题引入串引子串的存储顺序存储结构链式存储结构问题来了直观解决方案KMP算法前言next数组KMP算法改进 问题引入 串 引子 我们在生活中可以看到很多的所谓“串”,比如现在我写的这段话就是“串”,更多的,比如我们在网上查找资料,如下图: "KMP"就是一个字符串,而每次我们所搜所完之后界面显示带红色的字就是与之匹配的串,其实就是在一个串中找与之匹配的字串,我感觉搜索的想法很简单:我呈...

xwl666666的博客 3608

(原创)KMP算法史上最详解,图文并用,Java实现,一篇文章带你搞懂KMP算法

:前几天上网课学习KMP算法,玩手机去了,下来花了两天时间才算理解的差不多,于是打算写出来,希望能够对大家有一些帮助,话不多说,进入正题。

weixin_45227374的博客 860

『重点算法』KMP算法 + BF算法(暴力算法)

KMP算法的时间复杂度为:O(m + n) 原理:KMP算法是由克努特(Knuth)、莫里斯(Morris)、普拉特(Pratt)共同设计实现的,所以由他们的每个名字首写得来。KMP的算法核心在于相对于BF算法,主串 i 下标不用回退,而是利用一个next数组来确定下一个同步判断的 j 下标。 举个例子:为方便理解,以下例子中 k 为同步判断的起始位置

qq_62260160的博客 3149

【算法】串的模式匹配——BF算法与KMP算法详解

本文属于【算法】系列文章,主要介绍针对“串”数据结构的两种常用模式匹配算法,即BF算法与KMP算法。 本文从原始的BF算法开始讨论其实现以及缺陷并设想解决方案,以此引出KMP算法的设计思路,并抛出KMP算法的重要部件——next表的得出方法及代码实现,最后总结了nextval表的计算步骤。

Ethan's blog 2381

【算法笔记】KMP算法

KMP算法是一种非常高效且经典的字符串匹配算法,它通过巧妙的预处理机制,显著提升了在主文本串中查找模式串(被包含的字符串)的效率。个人学习总结笔记,不能保证非常详细,轻喷。

u012559967的专栏 1023

经典算法之KMP算法(C++代码)

核心步骤(构建next数组)KMP算法的核心在于利用已匹配的信息避免不必要的比较。它通过预处理模式串,构建一个部分匹配表(Partial Match Table),也称为"失败函数"(failure function)或"next数组"。还是上面的主串t,模式串p字符串匹配问题,下面是使用动画演示传统暴力匹配与kmp算法的比较(动画做的不是很好,凑合着先看加深一下理解,后面会优化)传统暴力匹配kmp算法观察kmp算法主串上的指针是没有回退的。

m0_74013450的博客 2654

聊聊KMP算法

KMP算法 PS:本文转载,觉得写得实在太通熟易懂了,收藏于博客中 原文:https://www.zhihu.com/question/21923021 背景 这几天自学了KMP算法,也在网上看了很多相关的博文,然而他们对next数组的求解方法的解释都比较模糊,难于让读者理解,故参考几位前辈的博文,加以优化,撰此博文,分享一下自己的理解。 简述BF算法 讲述KMP算法的原理之前,BF算法是绕不...

Huangy远 1022

KMP算法(一)

摘要:本文主要对KMP算法和BF算法从算法思想上做对比,用大家较为熟悉的BF算法引出KMP算法,在思想上进行对比,希望能够帮到初学者理解KMP算法思想,后续会再更新KMP算法中next数组,nextval数组以及KMP算法的具体实现

bxsjsjdjdp的博客 1452
上一篇: 记录一次打jar包获取不到文件的错误
下一篇: 记一次redis缓存的问题
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值