假设要在 haystack 中匹配 needle . 要理解 KMP 先需要理解两个概念 proper prefix 和 proper suffix,由于找到没有合适的翻译,暂时分别称真实前缀 和 真实后缀. 真实前缀(Proper prefix): 一个字符串中至少不包含一个尾部字符的前缀字符串.例如 "Snape" 的全部真实前缀是 “S”, “Sn”, “Sna”, and “Snap” . 真实后缀(Proper suffix): 一个字符串中至少不包含一个头部字符的后缀字符串…
KMP 算法(Knuth–Morris–Pratt algorithm)的基本思想 阅读本文之前,您最好能够了解 KMP 算法解决的是什么问题,最好能用暴力方式(Brute Force)解决一下该问题. KMP 算法主要想解决的是文本搜索的问题: 给定一个模式字符串 p 和一个子串 t, 找出 p 串出现在 t 串中的位置. 术语定义 "abc"(引号中的字符串): 代表字符串字面值 a-z(单个斜体小写字母): 代表字符串. A-Z(单个大写字母):代表单个字符. prefix(x,…
一.前言   在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符.这个算法是由高德纳和沃恩·普拉特在1974年构思,同年詹姆斯·H·莫里斯也独立地设计出该算法,最终由三人于1977年联合发表.(from:wikipedia)   KMP搜索(Knuth–Morris–Pratt string-se…
最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中所做的笔记,笔记后面提供了4种编程语言的仿真代码(C, C++, Python, Matlab),使实现方式更加灵活,同时增强对PID的理解.(文章较长,可点击右侧目录选择性阅读) PID算法学习笔记 参考:PID基础入门教程 一.位式控制算法 1.1 位式控制算法原理 位式控制算法,通过比较SV(…
倍增 目录 倍增 查找 洛谷P2249 重点 变式练习 快速幂 ST表 扩展 - 运算 扩展 - 区间 变式答案 倍增,字面意思即"成倍增长" 他与二分十分类似,都是基于"2"的划分思想 那么具体是怎么样,我们以一个例子来看 ST表才是文章的重点 QwQ 查找 洛谷P2249 依据题面,我们知道这是一个单调序列,当然可以通过二分的方式来寻找答案,但是既然我们这里讲倍增,那么就用倍增来写吧! 首先,我们先贴上核心代码 void find(int k) { int i…
前言 Miller-Rabin 算法用于判断一个数 \(p\) 是否是质数,若选定 \(w\) 个数进行判断,那么正确率约是 \(1-\frac{1}{4^w}\) ,时间复杂度为 \(O(\log p+w\log p)\).(我的实现) Pollard-Rho 算法可以在期望 \(O(n^{\frac{1}{4}})\) 的时间复杂度内找到合数 \(n\) 的某一个非平凡的(即既不是 \(1\),也不是它本身的)因子. 下文中用 \(\mathbb{P}\) 来表示质数集合. Miller-R…
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<:…<d2<d1),即所有记录放在同一组中进行直接插入排序为止. 该方法实质上是一种分组插入方法. 算法编码 void shellSort(int v[], int n)…
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的最长回文子串 时间复杂度:O(N) 算法步骤: 1.添加特殊字符 由于回文串的长度可奇可偶,比如"bob"是奇数形式的回文,"noon"就是偶数形式的回文,马拉车算法的第一步是预处理,做法是在每一个字符的左右都加上一个特殊字符,比如加上'#',那么 bob -->…
\(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快速的求出单源最短路,即一个源点的最短路. 而\(Floyd\)算法,这个及其简短的算法,可以以\(O(n^3)\)的复杂度算出任意一对点之间的最短路. 我们发现,\(floyd\)算法的时间复杂度和边的数量没有多大的关系,也就是说,\(floyd\)使用的最优条件是稠密图. 那么问题来了,如果我们面…
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些边权重为负数,但可能不存在负权重循环.它的工作原理是使用Bellman-Ford 算法来计算输入图的转换,该转换去除了所有负权重,从而允许在转换后的图上使用Dijkstra 算法.Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些边权重为负数,但可能不存在负权重循…