KMP算法的理解

2023-05-16

   串的模式匹配算法主要有两种,一是简单模式匹配,而是KMP算法。

  简单模式匹配算法很容易理解,每一次从主串的第一个位置起和模式串的第一个字符开始比较,如果相等就按照顺序一直比下去,如果不相等就把模式串和第二个位置开始继续进行比较,最后若匹配成功则返回主串中与模式串匹配的第一个字符的位置,虽然简单易懂也容易实现,但过程及其繁琐,有许多冗余的步骤降低了匹配效率。

   因此采用无回溯效率更高KMP算法,它哪哪都好除了看不懂,书本上的话简直没法看,感觉在讲天书!!!各种下标各种公式根本看不懂。

以下是我对KMP算法的个人理解:

  KMP和简单模式匹配算法的区别就是,主串和模式串匹配不成功时,简单模式匹配得屁颠屁颠跑回去,从上一次比较的下一个字符开始继续比较,就算中间有大部分比较过得,就算明知道第一个字符就不匹配的但我还是得去比,没办法,所以效率低下且各种回溯。

  而KMP算法是当在某个位置匹配不成功的时候可以根据之前匹配结果,从模式串的另一个位置开始匹配字符串,而不必从头开始,只需要将模式串后移即可,大大的提升了匹配效率,但如何确定后移的位置点呢?


T1   T2  ......Ts   Ts+1   Ts+2   ....   Ts+j-k-1   Ts+j-k   ....   Ts+j-1  Ts+j   ....


                    P0     P1     P2   .....    Pj-k-1       Pj-k      .....     Pj-1    Pj   ......


                              P0     P1    ....      Pk   ........


如上,只要求得k值就能知道模式串后移的目标位置。为方便说明,取数组从1开始计数。在这里定义next[j]数组,1<j<m,m是模式串的长度,含义为当模式串第j个位置匹配失败后,应该从next[j]处的字符继续与主串比较。

接下来才是重点:

众所周知,KMP算法的灵魂就是求next数组和nextval数组,不管各种资料怎么说,以我自己的思路先走一遍求解next数组的步骤:

 

以例题来说明:

 

模式串:ababaaababaa

口诀①:当j=1的时候,next[j]=0。

口诀②:子串的前后缀没有匹配部分,并且子串不为空,next[j]=1,用人话来说就是模式串里面没有任何一个字符能够匹配成功,没有任何重复元素,就跟abcd这种一样,遇见这种给它赋1就完事了。

口诀③:子串前后有匹配部分,就去数一数匹配部分有多长,比如aba,俩a匹配了,在一起互gay,长度为1,那么就给next赋匹配子串长度+1!!!即next[j]=2

例题计算步骤:

1.j=1,next[1]=0

2.j=2,模式串为a,没有匹配元素,next[2]=1

3.j=3,模式串为ab,没有匹配元素,next[3]=1

4.j=4,模式串为aba,前后串有匹配的a,next[4]=1+1=2

5.j=5,模式串为abab,ab匹配,next[5]=2+1=3

.......

最后求解的答案为:

0  1  1  2  3  4  2  2  3  4  5  6

再然而,这种KMP方法还是有缺陷,一些情况下也会产生冗余比较,原因不加以说明,直接记录步骤。

还是模式串ababaaababaa.

   用P1~Pm来表示模式串的第i个位置处的字符(1<i<m)

   另取k(-1<k<m-1),k=next[j]

比较Pi与Pk

若相等,则继续判断k值是否为0,若k=0,则nextval[j]=k,若k!=0,则nextval=nextval[next[j]].

若不等,nextval[j]=k=next[j]

解题步骤:

1.

j=1

nextval[1]=0

2.

j=2

P2=b

Pk(k=next[2]=1)=P1=a

Pi!=Pk,nextval[j]=k=1

3.

j=3

P3=a

Pk(k=next[3]=1)=P1=a

Pi=Pk,nextval[j]=nextval[next[3]]=0

.....

最后结果为:

0  1  0  1  1  2  0  1  0  1  0  2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KMP算法的理解 的相关文章

  • 一直没看的无人机定高

    除了定高的部分 xff0c 其他没看的还有一些控制函数 定高的原理的话 xff0c 也是利用了两级pid xff0c 按照原本的理解 xff0c 从外环开始看的话 xff0c 反馈高度比较容易获得 xff0c 就是激光测距得到的高度 期望高
  • 匿名无人机代码FlightCtrl简单分析

    这个flightCtrl文件 xff0c 是真的很长又很难 各种标志位啊 xff0c 判断啊 xff0c 开关啊 xff0c 逻辑判断啊什么的 xff0c 趁通宵把代码梳理一遍 这个文件里的函数虽不算最多 xff0c 但引用的头文件相当多
  • 简历—项目经验范例

    xff08 看着比较专业的一份项目经验样板 xff09 原文链接https mp weixin qq com s rxGTTVKryvYoyst jsayLw 项目一 米乐淘网上商城 项目名称 xff1a 米乐淘网上商城 开发环境 xff1
  • 家庭网络和路由器

    1 什么是家庭网络 xff1f 一个典型的家庭网络由多个设备组成 xff0c 且几乎所有的家庭网络都有一个路由器作为它们的中心设备 路由器连接到 Internet 连接 xff0c 然后与本地网络上的一台或多台计算机共享该连接 家庭网络通常
  • ROS动态调整PID

    64 动态调整PID ROS提供了一个专门用于动态调整参数的功能包dynamic reconfigure 它实现了动态配置参数的机制 我们先来创建一个功能包 添加相应的一些依赖 cd catkin ws src catkin create
  • CubeMX配置串口的程序烧入板子不跑的解决方法

    对于cubeMX配置串口 xff0c keil5编译通过的 xff0c 自己确定无问题的程序 xff0c 以ISP烧入 xff0c 烧入板子后无法运行的情况 xff0c 我暂时的解决策略是按住reset键点击 开始编程 xff0c 点击后松
  • realsense D455+ROS+OpenCV4.5完成目标距离检测

    ROS OpenCV 1 环境配置 1 1 realsense SDK2 0安装 通过官网找到最新的SDK包并下载 Intel RealSense SDK 2 0 解压安装包 xff08 librealsense 2 47 0 tar gz
  • 什么是 PID 控制器:工作原理及其应用

    什么是 PID 控制器 xff1a 工作原理及其应用 什么是PID控制器 xff1f 历史PID控制器框图PID控制器的工作P 控制器I 控制器D 控制器 PID控制器的类型开 关控制比例控制标准型PID控制器实时 PID 控制器 调优方法
  • 什么是缓冲区

    1 什么是缓冲区 缓冲区又称为缓存 xff0c 它是内存空间的一部分 也就是说 xff0c 在内存空间中预留了一定的存储空间 xff0c 这些存储空间用来缓冲输入或输出的数据 xff0c 这部分预留的空间就叫做缓冲区 缓冲区根据其对应的是输
  • FreeRTOS系统解析-1、FreeRTOS系统简介

    1 系统简介 不同的的多任务系统有不同的侧重点 以工作站和桌面电脑为例 xff1a 早期的处理器非常昂贵 xff0c 多以那时的多任务用于实现在单处理器上支持多用户 这类系统中的调度算法侧重于让每个用户 公平共享 处理器时间 随着处理器的功
  • 目标检测 YOLOv5 常见的边框(bounding box )坐标矩形框表示方法

    将txt格式的真值框 xff08 Ground Truth xff09 在原图上显示 具体过程坎坷 xff0c 以下博主提供了思路 xff0c 学习了yolo格式label的归一化和坐标求解 xff01 1 https blog csdn
  • momenta实习面经

    走的火箭计划内推 xff0c 链接https mp weixin qq com s zllOky0biV9zn1Qfbg4XZg 线上先做了一套题 xff0c 写的2小时但是打开界面发现倒计时有10小时 xff0c 于是悠哉悠哉慢慢做结果2
  • 树莓派4B + Ubuntu18.04 + RealSense SDK

    有段时间没写博客了 xff0c 今天心血来潮 xff0c 记录一下 我自己的配置在标题写的很清楚 xff0c 用的是ros1 安装步骤我是建议 xff1a ubuntu gt realsense SDK gt ros gt ros wrap
  • ubuntu18.04安装ROS Melodic(最详细配置)

    前期准备 61 61 设置软件源 xff1a 国外的 xff1a sudo sh c 39 echo 34 deb http packages ros org ros ubuntu lsb release sc main 34 gt etc
  • 3步搞定CSDN中代码背景颜色的修改

    1 进入内容管理 xff0c 点击最下方的博客设置 2 修改
  • 2019电赛--无人机题目OpenMV总结

    此文章在我的博客链接 xff1a https sublimerui top archives d508d500 html NOTES xff1a 上一篇相关博文 xff0c 准备阶段OpenMV学习笔记链接 xff1a https blog
  • 大疆精灵4RTK自定义三维航线规划(开源)

    大疆精灵4rtk是无人机摄影测量行业的一款里程碑式的产品 xff0c 极大地拓展了无人机摄影测量的应用领域 然而 xff0c 大疆官方只提供了有限的航线规划功能 xff0c 如带状航线 井字航线 xff0c 5向飞行 xff0c 仿地飞行等
  • docker拉取RabbitMq镜像并安装

    RabbitMQ安装入门篇 文章目录 前言一 Docker拉取RabbitMq镜像二 docker下启动RabbitMq容器三 查看RabbitMq是否启动总结 前言 这篇文章为了方便初学者入门 xff0c 在linux环境下用docker
  • 核间通信--Mailbox原理及内核驱动框架

    https blog csdn net weixin 34007291 article details 86026346 核间通信的主要目标是 xff1a 充分利用硬件提供的机制 xff0c 实现高效的CORE间通信 xff1b 给需要CO
  • mac下Wireshark报错: you don‘t have permission to capture on that device

    1 首先 首先 cd dev ls la grep bp 看见用户组 crw 1 root wheel 23 0 6 18 16 04 bpf0 crw 1 root wheel 23 1 6 20 04 20 bpf1 crw 1 roo

随机推荐

  • 大端模式、小端模式、高字节序、低字节序、MSB、LSB

    https blog 51cto com u 14114084 4930969 text 61 E9 AB 98 E4 BD 8D E5 85 88 E8 A1 8C E5 8D B3 E5 9C A8 E4 BC A0 E8 BE 93
  • PX4+ROS+gazebo+mavros,Ubuntu18.04搭建SITL仿真环境

    前言 介绍 SITL Software in the Loop 软件在环仿真平台 xff0c 与之对应的有 HITL 硬件在环仿真 本文目的是搭建一个无人机软件仿真环境 xff0c 使用PX4开源飞控 xff0c gazebo作为仿真器 x
  • ubuntu-firefox有网但是打不开网页的解决办法

    1 检查ubuntu右上角联网开关是否打开 xff0c 需要勾选Rnable Networking 2 如果能ping通其他主机地址 xff0c 浏览器却连不上网 xff0c 很有可能是DNS域名解析的问题 解决办法如下 xff1a 查看域
  • 我为什么选择了Gitee?

    声明 xff1a 个人见解 xff0c 仅供参考 xff0c 实际情况需要结合自身环境和技术领域做出选择 xff0c 且非常不建议同时使用两个或多个平台 不过个人使用还是推荐Gitee 文章结构 前言一 二者有何区别 xff1f 二 为什么
  • 解决:检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2””。

    vs2010下 项目 属性 配置属性 C C 43 43 预处理器 预处理定义 添加 ITERATOR DEBUG LEVEL 61 0 即可 xff08 因为我用的2013及以上版本 xff0c 试过这种方法 xff0c 还是出错 xff
  • 2021年Linux技术总结(四):Linux 驱动

    一 裸机驱动开发流程 所谓裸机在这里主要是指系统软件平台没有用到操作系统 在基于ARM处理器平台的软件设计中 xff0c 如果整个系统只需要完成一个相对简单而且独立的任务 xff0c 那么可以不使用操作系统 xff0c 只需要考虑在平台上如
  • C++ 编译错误 error: ‘cout‘ was not declared in this scope (摄氏度与华氏度的转换)

    练习c 43 43 的输入输出时 xff0c 编译遇到错误 xff1a error 39 cout 39 was not declared in this scope error 39 cin 39 was not declared in
  • rplidar的安装与使用

    rplidar的安装与使用 1 rplidar的安装2 RPLIDAR驱动下载3 将RPLIDAR连接好后 xff0c 检测串口是否连接成功4 编译工作空间并设置环境变量5 检查RPLIDAR A2的串行端口的权限并添加写权限 xff08
  • ros知识点1-1:节点发布话题,并设置发布频率

    1 创建节点发布话题 include ros ros h 针对ros中文本内容需要添加的头文件 include std msgs String h 发布方实现 int main int argc char argv ros init arg
  • CmakeLists.txt编写流程梳理

    目录 背景 xff1a 1 设置最低版本 xff1a 2 设置名称 版本号 xff1a 3 设置c c 43 43 支持版本4 设置编译器参数5 目标文件输出目录6 判断平台 xff0c 定义平台宏7 设置第三方头文件和设置链接库寻找路径8
  • Spring consider using ‘getBeanNamesOfType‘ with the ‘allowEagerInit‘ flag turned off, for example.

    看下spring说的类 xff0c 两个类之间发生循环引用了 xff0c 请在一方的注入属性上添加 64 Lazy注解 避免循环引用
  • 本地访问阿里云上部署的项目

    本地访问阿里云上部署的项目 1 确保本地能用ping命令连接阿里云服务器 命令 win 43 r 输入cmd ping 43 阿里云共网 ip 2 在阿里云官网上的安全组里进行相关配置 3 选择配置规则 xff0c 进行配置 4 重新在Xs
  • 在jeston nano开发板之中安装ros系统

    这段时间由于工作的需要 xff0c 要在jeston nano之中安装ros系统 jeston nano之中对应的系统是ubuntu18 04所对应的ros系统版本为ROS Melodic 在安装的过程之中遇见了很多的坑 xff0c 特此记
  • make的相关命令详解和区别

    makefile定义了一系列的规则来指定 xff0c 哪些文件需要先编译 xff0c 哪些文件需要后编译 xff0c 哪些文件需要重新编译 xff0c 甚至于进行更复杂的功能操作 xff0c 因为 makefile就像一个Shell脚本一样
  • TX2板 (ubuntu18.04系统)使用记录

    TX2板 ubuntu18 04系统 xff09 使用记录 一 TX2板 ubuntu18 04系统 xff09 更换国内软件源1 备份原软件源2 修改sources list文件3 更新 二 TX2板 ubuntu18 04系统 xff0
  • 海康威视相机标定、畸变矫正及AprilTag获取视觉标签三维信息

    海康威视相机标定 畸变矫正及AprilTag获取视觉标签三维信息 一 海康威视相机标定二 相机去畸变三 Apritag ros获得视觉标签的三维位置 一 海康威视相机标定 相机标定经调研共发现三种常用方式 xff1a 利用Matlab的ca
  • 如何切换Echarts主题

    一 打开Echarts官方文档 点击资源 gt 主题构建工具 进入到主题选择页面 二 选择默认主题 点击默认方案选择合适的主题 例如选择macarons xff0c 点击后右侧展示对应主题效果 三 应用主题 1 下载主题 点击下载主题 xf
  • C中strchr()函数用法

    strchr 函数包含于头文件 xff1a include lt stdio h gt 中 xff1b 函数原型为 xff1a char strchr char str char int c 函数功能为 xff1a 在字符串str中寻找字符
  • 切身经历,经理都慌了!云服务器连接成功蓝屏,桌面没有任何图标显示

    恢复了服务器数据 xff0c 结果服务器桌面任何东西都看不到了 xff0c 只有一个蓝色背景 xff0c 那一刻 xff0c 我心里是慌的 解决方案 xff1a 1 使用远程桌面 xff0c 输入您服务器IP地址登陆服务器 2 一个用户黑屏
  • KMP算法的理解

    串的模式匹配算法主要有两种 xff0c 一是简单模式匹配 xff0c 而是KMP算法 简单模式匹配算法很容易理解 xff0c 每一次从主串的第一个位置起和模式串的第一个字符开始比较 xff0c 如果相等就按照顺序一直比下去 xff0c 如果