首页 > 其他分享 >KMP学习笔记

KMP学习笔记

时间:2024-08-04 22:08:16浏览次数:8  
标签:匹配 失配 笔记 学习 KMP border sim 指针

KMP

一种字符串单模匹配算法。

原理

当模式串 \(s\) 与文本串 \(t\) 进行匹配时,容易想到的一种朴素做法就是将模式串的第一位与文本串的每一位进行试配。但是这样效率过低,容易被数据卡成 \(O(n^2)\)。

KMP 单模匹配算法引入了一个失配数组 border。

定义一个字符串的 border 为一个最长的字符串 \(s'\) 的长度,满足字符串 \(s'\) 既是 \(s\) 的真前缀,又是 \(s\) 的真后缀。

当失配时模式串 \(s\) 可以直接跳到 border 记录的位置,并且融入了动态规划的思想,避免了一次一次低效的匹配。

KMP 算法分 \(2\) 步:

  1. 将模式串 \(s\) 与其自己匹配,求出数组 border。

    具体的,定义两个指针 \(i\) 和 \(j\),表示此时 \(s[i-1-j+1 \sim i-1]\) 与 \(s[1 \sim j]\) 已经匹配成功的极大状态(以 \(i\) 和 \(j\) 结尾时无法实现更多字符的匹配),正在匹配 \(s[i]\) 与 \(s[j+1]\)。(指针 \(j\) 是匹配是横跳的指针,指针 \(i\) 从左到右移动)

    若 \(s[i]\) 和 \(s[j+1]\) 失配,首先明确此时应该尽量让 \(s[i]\) 与 \(s[j+1]\) 实现匹配。那么指针 \(i\) 保持不变(因为是用 \(s[1 \sim j]\) 去匹配 \(i\) 之前的一段),去移动指针 \(j\)。

    引理:当 \(s[i-1-j+1 \sim i-1]\) 与 \(s[1 \sim j]\) 匹配成功时,若 \(s[i]\) 和 \(s[j+1]\) 失配,则可能满足 \(s[i]\) 和 \(s[j+1]\) 匹配成功的最长字串的指针 \(j\) 的位置,应在 \(border[j]\) 处。

    根据 border 的定义,反证法易证。

    每次 \(i\) 进行匹配时,都会进行 \(border[i]\) 的标记,那么 \(border[j]\) 应在失配前就已经被标记了。所以,每次 \(s[i]\) 和 \(s[j+1]\) 失配时,就将指针 \(j\) 跳到 \(border[j]\),直到 \(s[i]\) 与 \(s[j+1]\) 匹配成功。

  2. 将模式串 \(s\) 与文本串 \(t\) 进行匹配,与第一步类似。

例题

  1. 模板题 P3375 【模板】KMP 代码:
for(int i=2,j=0;i<=lenb;i++){//first step
		while(j>0&&b[i]!=b[j+1]) j=fail[j];
		if(b[i]==b[j+1]) j++;
		fail[i]=j;
	}
	for(int i=1,j=0;i<=lena;i++){//second step
		while(j>0&&(j==lenb||a[i]!=b[j+1])) j=fail[j];
		if(a[i]==b[j+1]) j++;
		f[i]=j;
		if(f[i]==lenb){
			printf("%d\n",i-lenb+1);
		}
	}

标签:匹配,失配,笔记,学习,KMP,border,sim,指针
From: https://www.cnblogs.com/dayz-break/p/18342280

相关文章

  • QT 笔记
     HTTPSSSL配置下载配置子父对象QTimer*timer=newQTimer;//QTimerinheritsQObjecttimer->inherits("QTimer");//returnstruetimer->inherits("QObject");//returnstruetimer->inherits("QAbstractBut......
  • Java学习-Day5
    一、标识符含义:Java标识符是用来命名类、变量、方法以及其他的编程元素的名字。标识符命名规则:标识符可以由字母,美元符号($)和下划线(_)组成。不能以数字开头。区分大小写:例如myVar 和 myvar 是两个不同的标识符。不能是关键字:例如 int , class,public 等。不能包含空格......
  • 【学习笔记】哈希
    【学习笔记】哈希Hash的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围。主要用来判重!如何辨别哈希题?大概就通过一句话:当需要用\(O(1)\)的时间快速比较两个\(O(n)\)的东西时。应该对大部分题目都生效。字符串哈希感觉这一块OI_wiki讲得比较清楚。通常我......
  • 第二周--多维特征/2022吴恩达机器学习课程
    示例在先前的模型中,只有一个特征值x(房子的大小),你可以预测y,房子的价格。但是现在你又知道了多个细节。所以我们就需要更多的符号去表示对于的特征,如下:模型对比寻找一种更简单的方法重新写该表达式。向量这种算法叫多元线性回归为了实现这一点,我们有一个技巧叫矢量化......
  • 【机器学习】正则化的基本概念以及正则化成本和梯度的示例
    引言在机器学习中,正则化(Regularization)是一种技术,用于减少模型复杂度,防止过拟合,并提高模型的泛化能力。通过在损失函数中添加一个额外的惩罚项,正则化鼓励模型学习更简单、更平滑的函数,从而在未见过的数据上表现得更好文章目录引言一、正则化1.1正则化的形式1.1.1L1......
  • Python pymodbus类库使用学习总结
    实践环境Python3.9.13https://www.python.org/ftp/python/3.9.13/python-3.9.13-amd64.exepymodbus-3.6.8-py3-none-any.whlhttps://files.pythonhosted.org/packages/35/19/a9d16f74548d6750acf6604fa74c2cd165b5bc955fe021bf5e1fa04acf14/pymodbus-3.6.8-py3-none-any.whl......
  • UE5学习笔记3-关于charactor的相机和弹簧臂组件
    一、环境说明,UE5.4+ vs2022 +win11二、相机和弹簧臂的作用    个人理解上,相机的作用相当于一个视角,我将其理解成是一个人在哪个地方朝向哪个方向看,弹簧臂的用用我将其理解成为一个将人的视角和人物模型或其他模型连接的桥梁三、相机和弹簧臂的代码    ......
  • 学习笔记486—Macbook 咖啡厅麦当劳热点无法认证/连不上的解决方法
    Macbook咖啡厅麦当劳热点无法认证/连不上的解决方法笔者用的设备是MacBookpro14寸,m1pro版本。macos版本为13.2。之前一直碰到在星巴克/麦当劳/tims连不上店铺热点,只能连自己手机或者ipad热点的尴尬情况,翻遍了国内外相关论坛和网站,死活找不到解决方案。今天终于在一个售后维......
  • 深入理解 ReLU 激活函数及其在深度学习中的应用【激活函数、Sigmoid、Tanh】
    ReLU(RectifiedLinearUnit)激活函数ReLU(RectifiedLinearUnit)激活函数是一种广泛应用于神经网络中的非线性激活函数。其公式如下:ReLU(x......
  • Scalable Diffusion Models with Transformers(DIT)代码笔记
    完整代码来源:DiTDiT模型主要是在diffusion中,使用transformer模型替换了UNet模型,使用class来控制图像生成。根据论文,模型越大,patchsize越小,FID越小。模型越大,参数越多,patchsize越小,参与计算的信息就越多,模型效果越好。模型使用了Imagenet训练,有1000个分类,class_labe......