随笔分类 -  Algorithm

摘要:简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth、J.H.Morris和V.R.Pratt提出,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。 实现 构造 next[] 数组 前 阅读全文
posted @ 2023-12-08 18:57 Vivid-BinGo 阅读(11) 评论(0) 推荐(0) 编辑
摘要:#include <bits/stdc++.h> using namespace std; stack<char> stack_op; stack<int> stack_num; char str[10000]; string change; int pow(int x, int y) { int 阅读全文
posted @ 2020-10-03 08:49 Vivid-BinGo 阅读(134) 评论(0) 推荐(0) 编辑
摘要:简介 引入 若一个大小为 n 的整数序列 ,若存在一个数字 x 在这个序列中出现的次数大于 ,那么称 x 为这个序列的主元素。 理解 摩尔投票算法是基于这个事实: 每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。 或者更形象 阅读全文
posted @ 2020-06-13 17:23 Vivid-BinGo 阅读(316) 评论(0) 推荐(0) 编辑
摘要:题目 一个长度为 L 的升序序列 S,处在第个位置的数称为 S 的中位数。例如,若序列 ,则 的中位数是 15,两个序列的中位数是含他们所有元素的升序序列的中位数。例如,若 ,则 和 的中位数是 11。现在有两个等长升序序列 A 和 B,试设计一个算法,找出两个序列 A 和 B 的中位数。 分析 暴 阅读全文
posted @ 2020-06-12 16:58 Vivid-BinGo 阅读(1552) 评论(0) 推荐(0) 编辑
摘要:前言 As we all know,二叉树遍历的方法有递归和利用栈实现的迭代版本,他们的时间和空间复杂度都为 O(n) 。 然而,利用 Morris 遍历方法(利用叶子节点的左右空结点),可以将空间复杂度将为 O(1) ,时间复杂度仍为 O(n) 。 实现 前序遍历 1. 如果当前节点左孩子 cur 阅读全文
posted @ 2020-03-16 11:16 Vivid-BinGo 阅读(164) 评论(0) 推荐(0) 编辑
摘要:定义 给定一棵有根树,若结点 z 既是结点 x 的祖先,也是结点 y 的祖先,则称 z 是x,y的公共祖先。 在 x,y 的所有公共祖先中,深度最大的一个称为 x,y 的最近公共祖先,记为LCA(x,y)。 LCA(4 , 7) = 2,LCA(6,7) = 5 实现 暴力大法好 若求LCA(4 , 阅读全文
posted @ 2020-02-03 23:44 Vivid-BinGo 阅读(206) 评论(1) 推荐(0) 编辑
摘要:2的倍数特征: 整数末尾是0、2、4、6、8、……的数。 3的倍数特征: 整数各个位数字和是3的倍数。例如:3、6、9、12、15、18……、156…… 4的倍数特征: 整数末两位被4整除。例如:124、764、1148…… 5的倍数特征: 整数的末尾是0或5的数。 7的倍数特征: 整数末三位与前几 阅读全文
posted @ 2020-01-20 18:56 Vivid-BinGo 阅读(11406) 评论(0) 推荐(0) 编辑
摘要:定义 设 是有序集,且 ,表示有序集 S 的二叉搜索树利用二叉树的结点来存储有序集中的元素。它具有下述性质:存储于每个结点中的元素 x 大于其左子树中任一结点所存储的元素,小于其右子树中任一结点所存储的元素。二叉搜索树的叶节点是形如 的开区间。在表示 S 的二叉搜索树中搜索一个元素 x ,返回的结果 阅读全文
posted @ 2019-11-30 13:38 Vivid-BinGo 阅读(805) 评论(0) 推荐(0) 编辑
摘要:定义 在二维欧几里得空间中,凸包可想象为一条刚好包着所有点的橡皮圈。 用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。 实现 graham (葛立恒)扫描法 ① 找到所有点中最左下角的点 p0。(按 x 升序排列,如果 x 相同,则按 y 阅读全文
posted @ 2019-10-09 10:25 Vivid-BinGo 阅读(554) 评论(0) 推荐(0) 编辑
摘要:预备 两个向量 和 的叉积写作 由 和 可得: 当 时, 在 的逆方向。 当 时, 在 的顺方向。 当 时, 和 共线。 分析 快速排斥 两条线段分别为对角线构造矩形。 若这两个矩形不相交,则这两条线段肯定不相交。 若这两个矩形相交,则需要跨立实验进一步判断。 代码 跨立实验 如果两条线段相交,那么 阅读全文
posted @ 2019-10-02 01:51 Vivid-BinGo 阅读(822) 评论(0) 推荐(0) 编辑
摘要:定义 贝尔曼-福特算法,求解单源最短路径问题的一种算法,由理查德·贝尔曼(Richard Bellman) 和 莱斯特·福特 创立的。 它的原理是对图进行松弛操作,得到所有可能的最短路径。其优于迪科斯彻算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高。 原理 Bellman-Ford算 阅读全文
posted @ 2019-10-01 18:06 Vivid-BinGo 阅读(4146) 评论(0) 推荐(0) 编辑
摘要:定义 在连通图 G 中,如果删除顶点 u 及从 u 出发的所有边后所得的子图不连通,我们就称顶点 u 为图 G 的关节点或连接点。 原理 要解决这道题,我们可以检查图在单独删除各顶点之后的连通性,但这个算法要对每个顶点执行一次DFS, 效率不高。 不过,只要我们如下将DFS加以应用,就可以有效地找出 阅读全文
posted @ 2019-09-27 23:22 Vivid-BinGo 阅读(868) 评论(0) 推荐(0) 编辑
摘要:定义 SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。 原理 动态逼近法: ① 设立一个队列用来保存待优化的结点。 ② 优化时每次取出队首结点 u,并且用 u 点当前的最短路径估计值对 u 点所指向的结点 v 进行松弛操作,如果 阅读全文
posted @ 2019-09-27 13:24 Vivid-BinGo 阅读(974) 评论(0) 推荐(1) 编辑
摘要:定义 弗洛伊德最短距离算法(Floyd Shortest Path Algorithm)又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。 原理 我们的目标是寻找从点 i 到点 j 的最短路径。 从任意节点 i 到任意节点 j 的最短路径不外乎2种可能。 ①直接从 i 阅读全文
posted @ 2019-09-26 01:10 Vivid-BinGo 阅读(698) 评论(0) 推荐(0) 编辑
摘要:定义 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 原理 设图 G=(V,E) 所有顶点的集合为 V,起点为 S,最短路径树中包含的顶点集合为 S。在各计算步骤中,我们将选出最短路径树 阅读全文
posted @ 2019-09-25 21:40 Vivid-BinGo 阅读(1388) 评论(0) 推荐(0) 编辑
摘要:定义 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。 原理 设图 G = (V,E)所有顶点的集合为V,MST中顶点的集合为T。 ① 从G中选取任意顶点作为MST的根,将其添加至T。 ② 循环执行下述处理直至T=V 在连接T内顶点与V-T内顶点的边中选取权值最小的边 阅读全文
posted @ 2019-09-24 14:49 Vivid-BinGo 阅读(983) 评论(0) 推荐(0) 编辑
摘要:定义 Kruskal算法是一种用来查找最小生成树的算法。 准备 树:如果一个无向连通图中不存在回路,则这种图称为树。 生成树 :无向连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的极小连通子图。这里所谓极小是指:若在树中任意增加一条边,则将出现一条回路;若 阅读全文
posted @ 2019-09-24 00:53 Vivid-BinGo 阅读(752) 评论(0) 推荐(0) 编辑
摘要:定义 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。 该序列必须满足下面两个条件: ① 每个顶点出现且只出现一次。 ② 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在 阅读全文
posted @ 2019-09-18 21:56 Vivid-BinGo 阅读(487) 评论(0) 推荐(0) 编辑
摘要:去重全排列 康托 定义 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。 康托展开 令X为全排列中的次序,num[]为原数组,n为全排列中数字的个数,为num[j] (j>i)小于num[i]的个数。 则 阅读全文
posted @ 2019-09-11 14:13 Vivid-BinGo 阅读(264) 评论(2) 推荐(0) 编辑

点击右上角即可分享
微信分享提示