首页 > 编程语言 >串的模式匹配-KMP算法

串的模式匹配-KMP算法

时间:2023-10-12 18:34:40浏览次数:45  
标签:子串 字符 匹配 主串 next 算法 个字符 KMP 模式匹配

一个古老的模式匹配算法。
优点在于不需要回溯主串指针
在整个匹配过程中,只需要从头到尾扫描主串一次,方便处理那种大文件。

具体实现方法是对子串进行预处理,求得next数组。
这个数组记录的信息是:如果子串的当前比较位与主串不匹配,那么接下来应该把子串的哪个位与主串的当前位(因为主串指针不回溯 所以主串是继续用当前位进行比较)对齐来继续进行比较。

“当匹配过程中产生失配时,模式串向右滑动可行的距离多远。”

这里假设如下:

  • 子串中第1到k-1个字符已经与主串匹配完成
  • 目前待匹配的是子串第k个字符与主串第i个字符

则待求的next[j]的含义是:子串第j-k+1个字符到第j-1个字符都与主串完成匹配,且子串第j个字符与主串不匹配的前提下,应该把子串的哪个字符与目前与子串第j个字符不匹配的主串字符对齐进行比较,也就是子串最多能向右滑动多远以进行下一次匹配。

试图用语言描述一下求next值的过程

前提:数组第一个元素的逻辑索引值是1
假设当前要求子串中字符X的next值。
把X的前一个字符Y与【逻辑索引值等于Y的next值】的字符Z比较,有两种可能结果。

  1. 相同。则X的next值等于Z的逻辑索引值+1(当然也就是Y的next值+1)。
  2. 不同。则再把Y与【逻辑索引值等于Z的next值】的字符Z1比较。
    如果一直比较到字符Z的next值为0,但仍然不能实现Z与Y相同,则X的next值为1。

关于nextval(next函数的修正值)

主要是为了解决 当子串存在连续的相同字符时,假设子串有一字符X位于若干与其相同的字符之后,根据上述求next的过程,这些相同字符的next值依次递增1,则按照kmp算法规则,会在发现X不匹配后滑动若干次。但实际上因为这若干个字符都与X相同,所以只需要直接按照X的next值进行滑动即可。简单来说就是为了实现匹配时的连续滑动

语言描述求nextval的过程

将字符X与【逻辑索引值等于X的next值】的字符Y比较,有两种可能结果。

  1. 相同。则X的nextval值等于X的next值。
  2. 不同。则将X与【逻辑索引值等于Y的next值】的字符Z比较,若X与Z相同,则X的nextval值等于Y的(指的是更新到最新的Y,也就是【next值等于最后找到的那个与X相同的Z的逻辑索引值】的Y)的next值。
    如果一直比较到字符Z的next值为0,仍不能实现Z与X相同,则X的nextval值为0。

标签:子串,字符,匹配,主串,next,算法,个字符,KMP,模式匹配
From: https://www.cnblogs.com/iszxh/p/17760255.html

相关文章

  • 10.12算法
    最大子序和给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。 示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1]的和最大,为 6。示例2:输入:nums=[1]输出:1示例3......
  • 动物识别系统python+Django网页界面+TensorFlow算法模型+数据集训练
    一、简介动物识别系统。基于Python+TensorFlow+Django网页框架+ResNet50算法模型实现实现步骤如下:收集多种动物的图片数据集,并整理归类然后使用TensorFlow搭建ResNet50算法模型网络对数据集进行多次迭代训练最后得到一个精度较高的H5模型文件基于训练好的模型,使用Django开......
  • java算法之排序算法大全
    ①排序所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制......
  • Lnton羚通算法算力云平台智慧反光衣穿戴方案检测
    对于事故多发的施工现场,保障施工质量、施工人员的人身安全以及工地建筑材料和设备的财产安全是建筑企业管理者关注的首要任务。然而,由于每个建筑企业或开发商在地区甚至全国范围内都有多个分散的建筑工地,频繁到现场进行监管和检查需要投入大量人力和精力,因此管理上存在一定困难。Ln......
  • 串模式匹配-BF算法
    一种暴力的串匹配算法。指定主串中查找的起始位置。用两个指针分别遍历主串和子串,如果到达串尾就结束。当遇到子串与主串不匹配时,通过把主串指针回溯到当前起始字符的下一个字符来重新开始匹配。实现代码如下。#include<iostream>usingnamespacestd;#defineMAXLEN255......
  • 简单易学的机器学习算法——Latent Dirichlet Allocation(理论篇)
    引言LDA(LatentDirichletAllocation)称为潜在狄利克雷分布,是文本语义分析中比较重要的一个模型,同时,LDA模型中使用到了贝叶斯思维的一些知识,这些知识是统计机器学习的基础。为了能够对LDA原理有清晰的认识,也为了能够对贝叶斯思维有全面的了解,在这里对基本知识以及LDA的相关知识进......
  • Lnton羚通视频分析算法平台工地劳务实名制人脸识别管理方案
    Lnton羚通的算法算力云平台是一款优秀的解决方案,具有突出的特点。它提供高性能、高可靠性、高可扩展性和低成本的特性,使用户能够高效地执行复杂计算任务。此外,平台还提供丰富的算法库和工具,并支持用户上传和部署自定义算法,提升了平台的灵活性和个性化能力。在建筑工地场景中,施工人......
  • 交通标志识别系统python+TensorFlow+算法模型+Django网页+数据集
    一、介绍交通标志识别系统。技术涉及:Python编程语言开发TensorFlow搭建算法模型对数据集进行训练得到一个精度较高的模型文件Django开发网页端界面平台实现对58种交通标志图片进行识别二、效果图片展示三、演示视频and代码视频+代码+介绍:https://s7bacwcxv4.feishu.......
  • 算法:树链剖分
    去年就看过树链剖分的视频了,当时连树状数组,线段树都没学,对树的dfs也一知半解,所以基本完全听不懂。昨天又重新看了一般,感觉思路挺简单,应该比线段树简单吧,从用树链剖分求LCA来看确实是这样的,但是没有想到的是用线段树维护树链剖分。QAQ这应该是我打过最长的代码吧!(3K)树链剖分......
  • 【算法】游戏中的学习,使用c#面向对象特性控制游戏角色移动
    最近,小悦的生活像是一首繁忙的交响曲,每天忙得团团转,虽然她的日程安排得满满当当,但她并未感到充实。相反,她很少有时间陪伴家人,这让她感到有些遗憾。在周五的午后,小悦的哥哥突然打来电话,他的声音里充满了焦虑。“小悦,我有个事情想拜托你。”哥哥的声音传来。小悦不禁有些疑惑,哥哥......