KMP算法浅析

KMP算法浅析——与串的朴素的模式匹配算法对比 无论是串的朴素匹配算法还是KMP算法,其实质都是用模式串后移的方法去匹配主串。不一样的地方是在于朴素匹配算法真的是一个一个去比较了,这样就会使得主串和模式串都需要回溯,而KMP算法的不同就在于保证主串不回溯,把一些比较的操作模块化于求模式串的回溯值,虽然我说这两种算法的思想都是用模式串后移的方法去匹配主串,这个说法看起来算法的效率没什么变化,但实质上KMP算法的... 阅读详情

关于KMP算法,网上的资料虽然比较详细,但是却因为有太长的篇幅往往让人没有耐心读下去。所以我试着用自己语言写一篇比较简短白话的讲解。


首先要知道KMP算法是做什么的。

它是用来做字符串匹配的。举例:问acmacma中有几个acma?    KMP就可以解决这样的问题。


为什么要用KMP?

因为如果按照通常的思维搜索会很浪费时间,因为在搜索的时候会将没有必要搜索的再进行搜索。如:如上例,主串acmacma匹配acma。当一个acma匹配完成后,如果按照通常的想法则会从第一个c那里再来开始对acma。但用KMP,则是从模板串acma的c开始与主串的第二个c匹配。(这里不懂没关系,后面还会讲解)


那么KMP是怎么完成的呢?

它分为两步。

第一:构建next数组。第二:利用next数组来对主串进行匹配。


怎么构建next数组?

在这里,用到了KMP的核心思想:不断地利用已经掌握的信息。

这里给出代码来详细讲解求next数组过程

void makeNext(char p[],int ne[])//p是模板串,ne是next数组
{
    int len=strlen(p);
    ne[0]=0;
    for(int i=1,k=0;i<len;i++)
    {
        while(k>0&&p[i]!=p[k]) k=ne[k-1];//核心代码,不断地利用之前掌握的失配时应该匹配的位置来进行重新匹配
        if(p[i]==p[k]) k++;//如果相同,那么就再对下一个字符匹配,加1后的k是失配时应该重新匹配的位置
        ne[i]=k;//构建next数组
    }
}

注:这里next数组求的值与算法书中next数组的值含义不一样。这里next数组表示的是它的下一个位置如果失配,应该从此时next值的位置进行匹配。


next数组只有是失配的时候才会用到,因为失配了就要重新开始进行匹配。而如果重头开始匹配则会浪费时间。所以用next数组来确定重新匹配的地方是从哪里开始的。

还是用之前的例子,acmacma和acma匹配,当此时主串的第二个c已经失配的时候,这时候,next数组会将重新匹配的位置给到模板串acma的c这个位置。因为next数组保证了,模板串acma的c前面的字符都与主串失配位置前面的匹配成功。所以不用再重头开始匹配。


为何求的next数组能保证再次匹配的位置的前面都与主串失配之前匹配?

因为在求next数组的时候,就是对模板串自己与自己进行一次匹配。如果匹配成功就k++,k指的位置就会右移,既指向了主串与模板串下一个匹配的位置,也指向了当下一次匹配失配时应该重新匹配的位置。所以以此往复,就能保证。


求出了next数组就完成了任务的一半,接下来就是用next来对主串匹配。

下面给出代码

int kmp(char t[],char p[],int ne[])//t为主串,p为模板串,ne为next数组
{
    int n=strlen(t),m=strlen(p),cnt=0;
    makeNext(p,ne);//构建next数组
    for(int i=0,k=0;i<n;i++)
    {
        while(k>0&&t[i]!=p[k]) k=ne[k-1];//不断的利用next已经掌握的失配时应该重新匹配的位置
        if(t[i]==p[k]) k++;//相等的时候就移动位置
        if(k==m)//如果匹配正好完成了一个模板串,就计数
            cnt++;
    }
    return cnt;
}

这个利用next数组求主串与模板串匹配个数的代码与上面求next数组代码很类似,因为方法和思想都相同。不同的是一个是自身的匹配,一个是主串与模板串的匹配。


小结:KMP算法最重要的是它的思想:利用已经掌握的信息来求解当前的问题。

zemax混合式非序列模拟 注意不要点击左侧的非序列模式,那个时纯粹的非序列,会清除序列模式的数据。第2、4、6透镜材质为空气,是为了让光线进入到多重透镜内部。这时普通的优化方式会失败。平行光束经过多焦透镜时,会汇聚在不同焦距处。所以还需要控制能量的大小,进行优化。接下来用非序列模式设计一个多焦透镜。像面的孔径为圆形通光孔:0-1.2。透镜不同位置处有不同的聚焦位置。透镜的z轴位置相同,重合。 阅读详情

相关推荐

Mplus实战:随机截距交叉滞后模型(RI-CLPM)在心理学纵向研究中的进阶应用

本文深入探讨了随机截距交叉滞后模型(RI-CLPM)在心理学纵向研究中的进阶应用,通过Mplus实战演示了模型设定、结果解读及进阶建模策略。RI-CLPM能有效区分个体间差异和个体内变化,适用于追踪青少年手机使用与抑郁症状等研究。文章还提供了样本量规划、模型比较和结果可视化等实用技巧,助力研究者避免常见陷阱。

weixin_29220405的博客 369

KMP算法(研究总结,字符串)

KMP算法(研究总结,字符串) 前段时间学习KMP算法,感觉有些复杂,不过好歹是弄懂啦,简单地记录一下,方便以后自己回忆。 引入 首先我们来看一个例子,现在有两个字符串A和B,问你在A中是否有B,有几个?为了方便叙述,我们先给定两个字符串的值 A="abcaabababaa" B="abab" 那么普通的匹配是怎么操作的呢? 当然就是一位一位地比啦。(下面用蓝色表示已经匹配,黑色表示匹配...

dipinzhu4111的博客 5242

KV260-从开箱到人脸识别(小白入门)

波特率选择115200,数据为8位,停止位1位,无奇偶校验,点击链接即可完成通讯。空白的盘格式化之后及进行挂载,这时会被我们的操作系统接手管理,这时就具有了操作系统的属性,复制文件就是在操作系统下的文件系统基础上进行的操作,这个过程是相对的地址进行操作,因此,复制文件是在操作系统环境下完成的更高级的操作模式。空白的盘相当于一整块空白的存储单元,因为没有格式化也不具有文件系统的属性,只有当外部的硬件或者软件写进空白的区域,这种方式是对绝对物理地址进行的操作,因此,烧录文件是独立于操作系统的更低级的写入方式。

qq_53252845的博客 3815

KMP算法——浅析

目的:KMP是一种高效的字符串匹配方法。比较优势:1,当我们使用找到相同字符串位置的思路:逐个枚举主串的每一个字符,作为匹配模式串的起始字符,然后将两字符串从起始位置开始逐个比较,若遇到不匹配位置,则。直到模式串枚举完,或是主串结束仍为找到匹配位置为止。2,KMP算法的改进优化:它(引用博主 @阿阿阿安 的图解)由图可知, 我们每次是将模式串移动到那么什么是最大匹配位置?因此问题转化为了,以next数组存储 ,同时。next[i] 参照的对象是模式串中p[ 1 ~~ i ]这部分子串;

ayas12319的博客 641

Hierarchical Flow Partition(Top-down&&Bottom-up)

hierarchy flow是将设计切分成多个block,分别处理单个block,然后完成后,将它们进行拼接以完成最终的chip。一般划分为三个阶段:chip planning;physical budget就是pin assignmenthierarchy flow实现的方法有两种,一种是top-down,另一种是bottom-up,无论是哪种,都是都要通过flatten的方法分别全局范围进行优化实现。

qq_39493558的博客 3072

人工智能技术基础系列之:迁移学习

作者:禅与计算机程序设计艺术 1.背景介绍 随着深度学习和神经网络的快速发展,越来越多的应用场景需要处理大量的数据和复杂的任务。然而,由于计算资源、存储空间等条件的限制,传统的人工智能方法往往不能满足实际需求。因此,为了提高效率和降低成本,研究人员提出了迁移学习的概念。本篇文章将详细介绍迁移学习的基

AI天才研究院 699

浅析KMP算法

文中详细阐述了KMP的优化思路、border概念及next数组的构建方法,并通过示例演示算法执行过程。

doooge_awa的博客 1056

AgentScope实战训练营- Java从零开始快速构建Agent完整教程

本文基于阿里巴巴开源的 AgentScope Java 框架,从零开始手把手带你构建 AI 智能体应用。内容涵盖环境搭建、基础对话、工具调用、结构化输出、多Agent流水线、Hook可观测性、会话持久化、MCP协议、RAG知识库集成、多模态工具、技能系统、Spring Boot Web部署等21个核心模块,附带完整可运行代码示例,帮助Java开发者快速掌握Agent开发全流程。

program哲学 863

KMP算法的个人浅析

参考了博客园博主:sofu6 的博文:KMP算法详解-彻底清楚了(转载+部分原创) KMP算法用于快速比较在主串中模式串(p)是否匹配的问题,又可理解为类似搜索引擎中的关键字匹配。 相比传统的BF算法,优点在于提升了比对效率,主要体现在:不必像BF算法一样一个字符一个字符的比对,遇到坏字符就将p移到开始位置0,再一个个比对,而是移动到一个合适的位置,以此来减少无效的比对次数 该算法的重点在于弄懂其中用于存放: 比对过程中,模式串遇到不匹配的字符(这里叫做坏字符)时,模式串如何在主串中移动到合适的位置.

nkly的博客 642

QGis二次开发 —— 2、第一个程序 - 加载栅格tif与矢量shp文件(附源码)

QGis二次开发 —— 2、第一个程序 - 加载栅格tif与矢量shp文件(附源码)

1100

【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件

本文介绍了如何将C#游戏开发中的代码从单个.cs文件拆分到多个.cs文件中,以提升代码的可维护性和可读性。文章演示了在Visual Studio中创建Hero类和ShowInfo类的具体步骤:通过右键项目名添加新建类,将原有代码分别剪切到对应的类文件中,并自动生成命名空间。拆分后需要在Program.cs中通过"using"指令引用这些类,最后通过运行测试验证功能正常。这种模块化代码组织方式能有效解决单一文件代码过长、结构混乱的问题。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1137

“浅析kmp算法”

“浅析kmp算法” By 钟桓  9月 16 2014 更新日期:9月 16 2014 文章目录 1. 暴力匹配:2. 真前缀和真后缀,部分匹配值3. 如何使用部分匹配值呢?4. 寻找部分匹配值5. 拓展 5.1. 最小覆盖字串 6. 参考资料 首先,KMP是一个字符串匹配算法,什么是字符串匹配呢?简单地说,有一个字符串“BBC ABCDAB ABCDABCDABDE

ZH de 部落格 4672

C# ScottPlot 5.0 WinForms 十字光标示例:轻松实现动态数值显示,你学会了吗?

ScottPlot是一个免费、开源的.NET交互式绘图库,能够轻松地实现大型数据集的交互式显示。它支持多种图表类型,如折线图、柱状图、饼图、散点图等。ScottPlot的性能非常出色,即使是处理千万级别的数据也游刃有余。

java专栏 2218

数据结构之KMP算法浅析

数据结构之KMP字符串匹配算法浅析,包括推导细节、应用以及时间复杂度分析

hey_we_go_的博客 1246

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JavaScript实现kmp算法与思路浅析

写在最前 本次分享一下通过实现kmp算法的动画效果来试图展示kmp的基本思路。 欢迎关注我的博客,不定期更新中—— 前置概念 字符串匹配 字符串匹配是计算机科学中最古老、研究最广泛的问题之一。一个字符串是一个定义在有限字母表∑上的字符序列。例如,ATCTAGAGA是字母表∑ = {A,C,G,T}上的一个字符串。字符串匹配问题就是在一个大的字符串T中搜索某个字符串P的所有出...

一只 1927

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

kmp算法浅析

解释不对的地方 希望帮忙指出来我们一起探讨 1.kmp算法的原理:   本部分内容转自: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html2.next数组 即是找搜索词在 k属于[0,搜索词长-1] 位置时 前缀与后缀的最长公共子串(连续) 例如 :字符串 “ABC

m0_37232228的博客 347

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

经典算法之浅析kmp算法

         KMP算法,也就是字符串匹配算法,是很多场合都会用到的算法,这个算法想要解决什么样的问题呢?举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?          传统的求解,我想很多人都已经想到了,遍历源字符串的每一位嘛,依次和要匹配的字符串比较,code很easy,但效率较为低下,可以想到,时间复杂度...

可乐小浣熊 538

KMP算法学习浅析

花了半天的来学习KMP算法,勉强算是看懂并写出来了。 看了很多大佬的解析,感觉比较舒服的就是https://www.cnblogs.com/yjiyjige/p/3263858.html的文章了 文章中有很多的插图方便大家更好的理解next数组的定义以及KMP算法的实现 next数组的每一个元素值就是当P[j] != T[i]时,j指针的下一步移动位置 这里的i和j分别为主串和模式串在匹配...

liuxiang15的博客 313

浅析KMP——单模式串匹配算法

什么是KMP? 模式串匹配,就是给定一个需要处理的文本串和一个需要在文本串中搜索的模式串(长度远小于文本串),查询在该文本串中,给出的模式串的出现有无、次数、位置等。平时的朴素模式匹配算法十分低效,需要挨个遍历,十分糟糕。于是就有了KMP。KMP是由三位dalao研究而出。(我不想打名字) 哎 三位大佬分别是D.E.Knuth、J.H.Morris、V.R.Pratt...

dianman2828的博客 188

字符串匹配算法——KMP算法浅浅析

目录1 从最简单的想法开始2 利用模式串自身的特点来优化3 利用next数组优化串匹配4 构造next数组5 完整的程序6 参考文献 1 从最简单的想法开始 现有两个字符串text、pattern,需要从text中查找是否存在一个连续的字串和pattern相等,如果有的话就返回第一个查找到的字串的起始位置。如果不考虑效率的话,这确实是一个非常简单的任务,一个最简单的想法是两层循环比对,如下图所示: 2 利用模式串自身的特点来优化 假如模式串有着这样一个特点,在下标属于[0, j)的范围内有完全相等的前缀和

gzxb1995的博客 372
上一篇: poj 3984 迷宫问题 (BFS)
下一篇: hdu 3068 最长回文 (manacher算法)
Timeclimber
博客等级 码龄9年 25粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值