数据结构5:KMP算法详解

[数据结构]模式匹配算法--KMP算法详解 KMP 阅读详情

KMP算法优于BF算法的地方是指针不回溯,利用已经比较过的部分,将模式串向右移动尽可能远的距离,在继续比较。

KMP算法的核心就是构建一个next[]数组,以这个数组来决定移动的距离。

在此之前先引入 公共前缀后缀这个定义:

以”ABCDABD”为例,进行介绍:
- ”A”的前缀和后缀都为空集,共有元素的长度为0;
- ”AB”的前缀为[A],后缀为[B],共有元素的长度为0;
- ”ABC”的前缀为[A, AB],后缀为[BC, C],共有元素的长度0;
- ”ABCD”的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0;
- ”ABCDA”的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为”A”,长度为1;
- ”ABCDAB”的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为”AB”,长度为2;
- ”ABCDABD”的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0

示例:    主串:S: ABCABCDE    模式串 :T: ABCD

                          

 我们之所以会这样移动是因为我们的在大脑中模拟了字符的比较,显而易见B,C都不是A。等于说我们又计算或者说思考了两次,这就是省略了两步的BF算法,那么我们如何只思考一次就直接得到要将模式串移动到哪呢?这就是KMP算法的精髓,我们要利用字符串的前后缀公共长度,一个事实是:主串中已经匹配过的部分肯定也是模式串的一部分   所以如果模式串中没有和其前缀相同的字符或字符串,通俗一点说就是   看看有没有和以首字符为起始的相同的一个或多个字符,如果没有那就将模式串的首字符和上一次主串中未匹配的字符进行比较。  如上图。

如果有相同的字符则将模式串首字符移至   上一次  该字符和主串中字符匹配的位置    看下面示例:

主串  S: ABABACAD    模式串  T:ABAC                                                                                                                                                                                                                                                                                                                                                                 一:   ABABACAD                      二:ABABACAD                                                                                                                                       ABAC                                            ABAC                      

因为T[2]==T[0]   T[2]==S[2],所以T[0]==S[2]。因为T[0]和S[2]已经相等了所以当第一次比较至S[3]不匹配时,i不动,将j移动到T[0]后一位。   规定下标从1开始我们可以得到next[4]=2;这就是next值的基本计算思想;规定next[1]=0;可以通过递推的方式计算所有next值;

代码实现如下:

void get_next(string T,int next[])
{
    i=1;next[1]=0;j=0;
    while(i<T.size())
    {
        if(j==0||T[i]==T[j])
        {
            i++;
            j++;      //j是公共长度;
            next[i]=j;
        }
        else  j=next[j];   //回溯到最长公共前后缀的后一位。
    }
}

重点是j=next[j];   可以想象成模式串自己匹配自己, 当不匹配时,j指针回溯,和上述思想一样。

 

 

                

 

 

数据结构 —— 改进的KMP算法 KMP算法 如果我们要对下面的主串P和模式串P进行匹配 步骤一:i=3,j=3 模式串 “abab” 对应的 next 数组为-1 0 0 1(0 0 1 2整体右移一位,初值赋为-1),当模式串 P 和主串 S 进行匹配时,发现b跟c失配,于是模式串 P 右移 j - next[ j ] = 3 - 1 =2位。 步骤二:i=3,j=1 右移2位后,b又跟c失配。事实上,因为在上一步的匹配中,... 阅读详情

相关推荐

数据结构:BF算法,KMP算法之C、C++的实现

数据结构中BF算法,KMP算法的C,C++的实现

chain_X的博客 3336

数据结构(十)——KMP算法

一、KMP算法简介 1、通用暴力匹配算法 通常的字符串匹配算法流程如下: 从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串的下一个字符开始匹配,直到模式串被匹配完,则匹配成功,或主串被匹配完且模式串未匹配完,则匹配失败。如图: 目标字符串为“ABCDEFGHIJK”,模式字符串为“ABCE”,从左到右逐个字符匹配,如果匹配过程中有某个字符不匹配,就跳回去,将模式串整体向右移动一位,继续进行匹配。 只需要比较i指针指向的..

天山老妖 9003

【KMP算法详解——适合初学KMP算法的朋友】

KMP算法的初级体验,只为抛砖引玉之用

Bill_Hoo的专栏 2756

【数据结构】KMP算法(详解)

KMP算法+acwing

honortech的博客 8257

从课堂笔记到动手实践:用Multisim仿真高频谐振功放(丙类)的完整流程

本文详细介绍了使用Multisim仿真高频谐振功放(丙类)的完整流程,从仿真环境准备到电路搭建、偏置网络设计、信号注入与波形观测,再到效率优化与性能验证。通过14个关键操作步骤,帮助读者将高频电子线路的理论知识转化为动手实践,深入理解丙类功放的非线性工作状态和效率优化技巧。

weixin_30701575的博客 520

Freemarker整合poi导出带有图片的Excel教程

Freemarker整合poi导出带有图片的Excel教程 https://blog.youkuaiyun.com/x541211190/article/details/105675771根据此人博客可完成此功能,但原文中有一处错误需要纠正,当单元格合并时,计算起始单元格有错误。 源代码: /** * 构造合并单元格集合 * * @param createRowIndex: * @param cellRangeAddresses: * @param startIndex: * @param c

weixin_39403349的博客 1004

KMP算法(Java实现)

      KMP算法同BF算法一样,也是字符串匹配算法,BF算法是主串指针与子串指针一一进行比较,如果失配,那么主串和子串的指针都需要进行回退,而KMP的算法思想是主串指针不回退,子串的指针只需要回退到一定的位置也可以完成字符串的匹配,学习一下吧 KMP算法的原理 这里我只是为了解析KMP的代码,原理问题就不花时间分析了 直接来看大话数...

博客 991

Gröbner基方法入门第I部分:项序和约化

Gröbner基方法入门第I部分:项序和约化 理想的准素分解与矩阵分解是计算代数的核心问题,它们在计算机代数、计算代数几何、代数编码和密码学、多维系统理论等学科都有非常重要的理论意义与应用价值.Gröbner基理论是研究理想的准素分解与矩阵素分解的重要工具之一.更简单地概括:Gröbner基方法是从任意一个多项式理想的一组给定生成元,计算另一组性质良好的生成元,并称为该理想的Gröbner基.它能用来判定任意多项式是否属于该理想. Gröbner基的代数算法是Buchberger在1960年代开发的,并

MinCong Luo的博客 4265

KMP算法重点讲k=next[k],聊聊Android开发的现状和思考

下面是辛苦给大家整理的学习路线《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84149836的博客 991

新版股票配资系统源码/股票分析系统技术方案

新版股票配资系统;全套源码支持新股申购功能,包含C#+MySQL开发的后台系统及Spring框架,采用C/S架构。注意:本源码仅限技术学习、功能测试及模拟交易使用,严禁用于非法用途,违者责任自负。

q318136906的博客 1644

服务器卡死排查实战:从现象分类到根因定位的完整手册

服务器卡死是运维中最令人头疼的故障之一,从游戏圈吐槽的“土豆服务器”到生产环境中的Linux系统无响应、rsync复制挂起,本质都是系统或进程失去正常响应能力。其原理通常涉及CPU、内存、磁盘IO或网络资源耗尽,以及内核和驱动异常。掌握系统化的排查方法,能够帮助工程师快速定位根因、缩短故障时间,避免盲目重启。本文从资源、层级、场景等多维度分类,结合top、dmesg、strace等工具,梳理一套从现象确认、指标收集、日志分析到进程定位的实战排查流程,并覆盖常见高频场景与预防治理建议。无论你是运维新手还是老手

weixin_33851177的博客 376

数据结构- KMP 算法

KMP 算法

每天进步一点点! 2111

BIOS硬件监控实战:如何手动读取IT8738芯片的温度与风扇数据(附代码)

本文深入探讨了如何绕过操作系统和HWMonitor等监控软件,直接通过寄存器级操作读取IT8738超级I/O芯片的硬件监控数据。文章提供了从动态定位EC空间、构建底层读写函数到解码传感器寄存器映射的完整实战指南,并附有C语言代码示例,帮助开发者理解BIOS硬件监控的底层原理,适用于定制硬件开发与故障诊断。

weixin_29192211的博客 109

数据结构KMP算法配图详解(超详细)

前言 KMP算法是我们数据结构串中最难也是最重要的算法。难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维。真正理解代码的人可以说对KMP算法的了解已经相当深入了。而且这个算法的不少东西的确不容易讲懂,很多正规的书本把概念一摆出直接劝退无数人。这篇文章将尽量以最简单的方式介绍KMP算法以及他的改进,文章的开始我先对kmp算法的三位创始人Knuth,Morris,Pratt致敬,懂得这...

weixin_46007276的博客 24万+

使用 Simulink Real-Time 搭建一个完整的实时信号采集与滤波系统模型

本文详细介绍了基于Simulink Real-Time构建实时信号采集与滤波系统的完整流程。主要内容包括:系统配置(模型创建与参数设置)、信号采集模块搭建(模拟信号源或真实硬件连接)、实时滤波器设计(浮点/定点)、输出可视化(Scope/ToWorkspace等)、模型编译与下载到目标机、外部模式在线调试及数据保存方法。系统可实现微秒级实时信号处理,适用于工业控制、航空航天等对时间确定性要求高的场景。文章还提供了优化建议(多速率建模、优先级调度等)和应用场景说明,帮助读者快速掌握实时系统开发的核心技能。

amy_mhd的博客 304

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构KMP算法详解

KMP算法的改进可以简述为: 如果a位字符与它next值指向的b位字符相等,则该a位的nextval就指向b位的nextval值,如果不等,则该a位的nextval值就是它自己a位的next值。我们一开始想到的是暴力求解,我们是将子串和主串逐一匹配,如果第一个字符相等就继续匹配第二个字符,直到子串与主串全都匹配成功,就返回子串的位置,一旦其中某两个字符匹配不成功,主串就回到开始匹配字符的下一字符,而子串回到第一字符。这个例子中当‘b’与‘c’不匹配时应该‘b’与’c’前一位的‘a’比,这显然是不匹配的。

强哥的微博 3838

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

字符串算法——KMP算法C++详解

简介 KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。...............

m0_54615144的博客 8870

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

KMP算法详解

KMP算法是求解主串(以下简称为s)和模式串(以下简称为p)匹配问题的O(n)算法。 其核心思想就是,当s[i]和p[j]发生不匹配现象时,i指针不需要回溯,只需j指针回溯。 例如: 当s[i]和p[j]发生失配,一种暴力的方法就是i回溯到上一次起始位置的下一个位置,j移动到0,然后重新进行比较。 但是实际上,从我们人的角度来看,solution1一定是进行了一次无用的匹配,因为这次匹配一定是无...

darknight 1万+

【数据结构】串模式匹配及KMP算法详解——看不懂来砍我

本篇博客参考了以下几篇文章和视频: 参考1 参考2 武大MOOC 初学数据结构,第一次遇到了一根难啃的骨头——串的模式匹配算法(KMP),虽然网上关于KMP算法的介绍很多,但多半叙述不全面,推导不流畅。因此自己写了这篇博客,尽可能以因果关系呈现KMP算法。 本篇博客尽量以最通俗,详尽的语言解释KMP算法,全文干货,无废话。 KMP是用来干嘛的? 简而言之,KMP算法较好的解决了串的模式匹配问题,即判断模式串(t)是否是目标串(s)的子串,注意子串包含目标串本身,也包含空串。例如aaab是aaabaab

qq_45888298的博客 6712

数据结构kmp算法千字图文详解

kmp算法是我们最难也是最简单的算法,接下来由博主以博主认为最通俗易懂的方式来带着大家学习kmp算法。

m0_65038072的博客 3255

【数据结构与算法】KMP算法

kmp算法,带你从底层逻辑,猜测巨佬的思考逻辑。

Shun_Hua的博客 5881

串的模式匹配:KMP算法详解

KMP算法

2202_75416613的博客 1914

kmp算法详解

从头到尾彻底理解KMP 此文转自神的博客  http://blog.youkuaiyun.com/v_july_v/article/details/7041827# 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。后收录于新书《编程之法:面试和算法心得》第4.4节中。 1. 引言     本KMP原文最初写于2

楠先生 4万+

数据结构:KMP算法

前缀表也就是next数组要求的是最长相等前后缀的长度,例如a的最长相等前后缀为0,aaa得到最长相等前后缀为2,aaba的最长相等前后缀为1。

pancodearea的博客 2474
上一篇: 数据结构4:Tire树入门
下一篇: 数据结构6:二叉树的代码实现
Androids_lost_Sheep
博客等级 码龄8年 1022粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值