首页 > 编程语言 >对KMP算法的疑问与理解

对KMP算法的疑问与理解

时间:2024-10-15 18:20:53浏览次数:3  
标签:abab 字符 匹配 后缀 模式 算法 KMP 滑动 疑问

对KMP算法的疑问与理解

核心: 在逐字符遍历主串与模式串的过程中,发生失配时,不回溯主串的i字符指针,而是通过确定已经匹配过的模式串的子串的前缀集合与后缀集合的交集中最长元素的长度,来移动模式串的j字符指针,实现模式串的整体向右滑动,跳过绝不可能发生的字符串匹配,以此实现对朴素BF算法的优化

PMT: 部分匹配表(Partial Match Table),存放模式串的前缀集合与后缀集合的交集中最长元素的长度.

在这里插入图片描述

eg:
当index为6时,此时模式串为"ababab",
则前缀包括{a,ab,aba,abab,ababa},
后缀包括{b,ab,bab,abab,babab},
前缀与后缀集合的交集为{ab,abab}
则PMT值为"abab"的长度4
ababab
ababab

下面我们来看主串为ababababca与模式串 abababca的匹配
在这里插入图片描述

对于第一次匹配(a),主串在i处(index = 7)处失配,则主串和模式串的前边6位是完全相同的。

为什么能够用KMP算法来改进朴素的Brute-Force算法,通过移动j,来代替回溯i?
在这里插入图片描述

而不断左移或右移,得到的最终结果是相同的,故能使用KMP算法来进行改进。

设主串为T,模式串为P,那么回溯i,发生的三次首字符比较,实际上是
T[0] == P[0]?
T[1] == P[0]?
T[2] == P[0]?
可见,第一次比较发生失配,第二次比较首字符就不相等,应该跳过,第三次成功匹配。

为什么能够向右滑动?
=>首次匹配后能够确定主串i前的六个字符与模式串j前的六个字符是完全相同的,而这六个字符的最大相同前缀与后缀为abab,那么i前的四个字符就为六个字符的最大相同后缀abab,而j能够在滑动2个字符的距离后,使得j前的四个字符为六个字符的最大相同前缀abab

向右滑动的细节:
向右滑动的过程中会跳过一个b,这其实就是跳过的那一步

困扰笔者三天的问题与疑点:
为什么被跳过的字符位置,就是绝对不可能被匹配的情况?
=>让我们将目光重新放回到"字符串的前缀集合与后缀集合的交集中的最长元素",即最长公共前后缀上。
在这里插入图片描述

被跳过的是第二种情况,即模式串向右滑动一格的情况。

而最长公共前后缀为abab,长度为4,模式串应该向右滑动两格(6-4=2)。

!! 意即,当模式串向右滑动[0,2)格时,无法实现最长公共前后缀的匹配,即使得模式串中j前对应的前缀abab滑动到主串i前的后缀abab处,使得最长公共前后缀匹配上。

因此,我们便能够确定模式串向右滑动一格时,
i前四个字符为abab,而与其对应的模式串的四个字符为baba,不匹配。
当模式串向右滑动两格时,
i前四个字符仍为abab,而与其对应的模式串的四个字符为abab,匹配。

式串向右滑动两格时,
i前四个字符仍为abab,而与其对应的模式串的四个字符为abab,匹配。

标签:abab,字符,匹配,后缀,模式,算法,KMP,滑动,疑问
From: https://blog.csdn.net/z20051118/article/details/142942827

相关文章

  • 数据结构与算法篇(回溯&递归&分治 - 刷题篇)(目前一天图片上传太多加载不出来)(后续更新)
    目录1.没有重复项数字的全排列(中等)1.1.题目描述1.2解题思路1.3代码实现方法一:递归方法二:非递归版2.有重复项数字的全排列(中等)2.1.题目描述2.2.解题思路2.3.代码实现递归+回溯(推荐使用)3.岛屿数量(中等)3.1.题目描述3.2.解题思路3.3代码实现方法一:dfs......
  • 【优选算法】(第四十二篇)
    目录最⼩基因变化(medium)题目解析讲解算法原理编写代码单词接⻰(hard)题目解析讲解算法原理编写代码最⼩基因变化(medium)题目解析1.题目链接:.-力扣(LeetCode)2.题目描述基因序列可以表⽰为⼀条由8个字符组成的字符串,其中每个字符都是'A'、'C'、'G'和'T'之......
  • 21岁,在大模型独角兽当算法实习生!
    转眼间也实习半年了,浅浅分享一下在智谱面试的经验吧!大模型算法面试题整理1、现在的大语言模型为什么基本都用decoder-only结构?2、训练一个大语言模型的整条路线是什么?介绍下LoRA、Adapter、prefix-tuningP-tuning和Prompt-tuning?你觉得OPENAI对齐为什么要用强化学......
  • 【路径规划】一种考虑拥塞的改进路径规划算法[CCPF-RRT*](Matlab代码实现)
    ......
  • 【储能选址定容】基于多目标粒子群算法的配电网储能选址定容(Matlab代码实现)
     ......
  • Snowflake算法js(实现)
    Snowflake算法是一种分布式环境下的唯一ID生成算法,最初由Twitter开发并在其内部使用。该算法旨在生成全局唯一、递增的64位整数ID,同时具备高性能的特点。以下是Snowflake算法的一些关键特点及其工作原理:特点全局唯一性:生成的ID在分布式环境中几乎可以保证全局唯一。时间有......
  • LeetCode刷题日记之回溯算法(四)
    目录前言非递减子序列全排列全排列II总结前言今天是学习回溯算法的第四天,我们继续来一起学习回溯算法蕴含的逻辑处理,希望博主记录的内容能够对大家有所帮助,一起加油吧朋友们!......
  • 素数筛法算法
    素数定义:素数是指在大于1的自然数中,除了1和它本身外,没有其他因数的数。换句话说,素数只有两个正因数:1和它本身。注意:0和1既不是质数也不是合数。inlineboolisprime(intx){for(inti=2;i<=x-1;++i){if(x%i==0)return0;return1;}}in......
  • (递归)算法
    递归条件:1.终止条件,当满足这个条件时,递归将停止并返回一个值,这个条件是为了防止函数无限递归,导致栈溢出。2.递归条件,这个是函数调用自身的地方,通常是通过将问题分解为更小的子问题来解决。例如求n的阶乘:deffactorial(n):#基线条件ifn==0:return1......
  • 【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
    @目录一、算法概念一、算法原理(一)分类算法基本思路1、训练集和权重初始化2、弱分类器的加权误差3、弱分类器的权重4、Adaboost分类损失函数5、样本权重更新6、AdaBoost的强分类器(二)回归算法基本思路1、最大误差的计算2、相对误差计算3、误差损失调整4、权重系数计算5、更新样本......