首页 > 编程语言 >KMP算法

KMP算法

时间:2024-09-30 21:13:10浏览次数:7  
标签:匹配 前缀 后缀 next 算法 KMP

引言

之前在打ACM竞赛时就学过一些字符串相关的算法,其中就包括KMP。但是面向竞赛的KMP算法和面向408的KMP算法在一些概念和实现细节上有细微差异,所以特意写了这篇文章对408中的KMP算法做出总结

字符串的前缀、后缀和部分匹配指

前缀指除了最后一个字符以外,字符串的所有头部子串;后缀指除了第一个字符外,字符串的所有尾部子串,部分匹配值则为字符串的前缀和后缀的最长相等长度

比如字符串aba,有前缀{ab,a},后缀{ba,a},二者交集为{a},因此最长相等的前后缀长度为1。我们用数组pi[i]表示长度为i的前缀的部分匹配值

next数组

当发生失配时,假设现在主串匹配到了i,模式串匹配到了j。如果是暴力匹配,我们应该将i回退到i-j+2,j回退到1,但是由于前面已经匹配了一部分,所以我们可以不用从头开始匹配。而是将j回退到j-move,其中move=(j-1)-pi[j-1]

整理得:

\[next[j] = j - ((j-1)-pi[j-1]) = pi[j-1] + 1 \]

这个1有时加有时不加,如果是选择题的话,我们主要看next[1]是0还是-1

通过上述分析,我们可以得到next函数的公式

\[ next[j]= \begin{cases} 0,j=1 \\ max\{k|1<k<j且'p_1 \dots p_{k-1}'='p_{j-k+1} \dots p_{j-1}'\},当此集合不为空时 \\ 1 其他情况 \end{cases} \]

基于此我们来讨论next数组的意义,next数组提供给我们的信息是,当模式串指针为j发生失配时,下一个应该匹配哪个位置,而next[1]=1则是说,第一个字符失配了,此时应该将i和j都加一

KMP算法可以保证线性复杂度,是因为主串不回溯,也就是说i的值永远不会变小

KMP算法的进一步优化

当\(p_{j} \neq s_{i}\)时,下一步必然发生\(p_{next[j]}\)和\(s_i\)的比较,而当\(p_{j} = p_{next[j]}\)时,这次比较将会变得毫无意义,为了进一步优化该算法,当出现\(p_{j} = p_{next[j]}\)时,需要再次进行递归,将\(next[j]\)修正为\(next[next[j]]\)

后记

KMP算法求next数组的过程也是线性的,这个结论考研不涉及,我们不证。感兴趣的读者可以去了解一下势能复杂度分析

标签:匹配,前缀,后缀,next,算法,KMP
From: https://www.cnblogs.com/AH20/p/18442439

相关文章

  • 高精度算法-减法
    ​//高精度算法-减法#include<iostream>#include<string>#include<vector>#include<cmath>usingnamespacestd;intmain(){strings1,s2;//减法.getline(cin,s1);getline(cin,s2);//减法的2个必要数字.inta1[200]={0};inta2[200......
  • 代码随想录算法训练营第六天|Day6哈希表基础
    242.有效的字母异位词题目链接/文章讲解/视频讲解:https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html思路1.暴力的解法,两层为循环,很明显时间复杂度是O(n^2)。boolisAnagram(char*s,char*t){if(......
  • 3. 算法笔记-对数器
    对数器是一个非常重要的自我验证技巧,其实现步骤如下:(1)方法A(2)方法B(3)随机样本产生器(4)用相同的样本验证方法A和方法B,比对结果是否一致。(5)若出现样本,使得结果不一致,查找原因,进行改进。(6)否则,方法验证成功。#include<vector>#include<cstdio>#incl......
  • 全同态加密算法概览
    我们前面有谈到《Paillier半同态加密算法》,半同态加密算法除了支持密文加法运算的Paillier算法,还有支持密文乘法计算的RSA算法,早期的PSI(隐私求交)和PIR(匿踪查询)都有使用基于RSA盲签名技术来实现。今天我们来谈谈能够有效支持任意函数密文计算的全同态加密算法(fully......
  • 谨防火灾!电瓶车检测AI算法助力城市/小区/园区多场景安全管理精细化、智能化
    随着人工智能技术的快速发展,AI智能分析网关V4在电瓶车检测领域的应用日益广泛。这一技术通过深度学习、计算机视觉等先进算法,实现了对电瓶车及其相关行为的智能识别和分析,为电瓶车的管理和应用提供了强大的技术支持。一、电瓶车检测算法的工作原理电瓶车检测AI算法主要基于计算......
  • Drain算法-笔记
    简介论文链接:https://jiemingzhu.github.io/pub/pjhe_icws2017.pdf算法原理图:有几点注意:根节点和叶节点实际是一套规则,并不包含日志数据真正的日志数据在叶节点之下的LogGroup第一层节点,基于假设:具有相同日志事件的日志消息可能具有相同的日志消息长度第二层节点,基于......
  • 排序算法之——归并排序,计数排序
    文章目录前言一、归并排序1.归并排序的思想2.归并排序时间复杂度及空间复杂度3.归并排序代码实现1)递归版本2)非递归版本二、计数排序1.计数排序的思想2.计数排序的时间复杂度及空间复杂度3.计数排序代码实现总结(排序算法稳定性)前言今天我们一起来了解归并排......
  • 代码随想录算法训练营第六天|理解hash表
    WhatisHashTable?引用自文章链接:https://programmercarl.com/哈希表理论基础.html#哈希表哈希表是根据关键码的值而直接进行访问的数据结构。直白来讲其实数组就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。哈希函数通过hashCode把......
  • 计算机视觉算法
    计算机视觉算法详解及代码实现1.引言计算机视觉(ComputerVision,CV)是人工智能的重要分支,旨在让计算机具备从图像或视频中理解和提取有用信息的能力。随着深度学习技术的兴起,计算机视觉已经在诸多领域取得了突破性进展,如自动驾驶、医疗影像分析、安防监控等。本文将介绍计......
  • 轴承寿命预测 | 基于TCN时间卷积神经网络算法的轴承寿命预测附matlab完整代码
    轴承寿命预测|基于TCN时间卷积神经网络算法的轴承寿命预测附matlab完整代码数据划分:将数据集划分为训练集、验证集和测试集,通常采用时间序列数据的方式进行划分。构建TCN模型:设计TCN模型结构,包括卷积层、激活函数、池化层等。确保模型能够有效学习时间序列数据的特征。......