![](https://img-blog.csdnimg.cn/20200731215733444.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法学习
文章平均质量分 82
记录在学习算法时的感想和笔记,以及一些个人的见解和分析,并附带各个算法的实例
HeartFireY
可能是ACMer、JXNU计算机科学协会前会长
展开
-
回坑记之或许是退役赛季?
最终决定还是把DS和String搞到底,那么就开始规划一下时间安排。原创 2022-09-03 23:42:38 · 392 阅读 · 1 评论 -
快速创建题目文件夹
闲来无聊,于是写了个BAT,用于创建题目文件夹。注此时编译的文件会集中写入。目录下,避免乱七八糟的现象。原创 2022-07-23 18:08:56 · 166 阅读 · 0 评论 -
图论 最小生成树 Boruvka算法
文章目录一、前导1.Kruskal和Prim的回顾2.Boruvka算法引入二、Brouvka原理与实现1.基本原理2.基本过程3.实现一、前导1.Kruskal和Prim的回顾首先我们对KruskalKruskalKruskal和PrimPrimPrimu算法进行回顾:KruskalKruskalKruskal算法的基本思想是维护一个森林,查询两个结点是否在同一棵树中,并连接两棵树。在实际的算法过程中,我们需要对边集进行排序,复杂度O(mlogm)O(m \log m)O(mlogm),并使用原创 2021-11-09 22:08:53 · 2501 阅读 · 1 评论 -
数据结构 ST表 详解
数据结构 ST表 详解一、什么是ST表1.可重复贡献问题可重复贡献问题是对于运算optoptopt,运算的性质满足x opt x = xx\ opt\ x\ =\ xx opt x = x,则对应的区间询问就是一个可重复的贡献问题,例如:最大值满足max(x,x)=xmax(x, x) = xmax(x,x)=x,最大公因数满足gcd(x,x)=xgcd(x, x) = xgcd(x,x)=x,因此RMQ问题和GCD问题就原创 2021-08-01 09:54:20 · 14898 阅读 · 2 评论 -
沈阳打铁记录+暑假训练开始分界线
沈阳打铁记录+暑假训练开始分界线沈阳打铁了。。。为啥打铁了,肯定是有原因的。自从期末复习(大概快1个月前了)就几乎没有再碰过代码,碰也是写点简单的Python数据结构和应用,训练强度几乎为0,思维的活跃状态大幅衰减。刚放假急着回家,回到家也没怎么训练,只是在休息和陪陪爸妈,期间还饱受颈椎病摧残。。。比赛前模拟了几场,感觉冲一冲还可以。结果场上打懵逼了,榜的方向偏的很,开局签到两题,队友先速签一题,我接着又翻了一题,但是读题眼瞎漏掉了倒数第二段条件,WA了5发,全场排名第9。当时感觉再写两题还可以拿个铜奖原创 2021-07-20 09:59:37 · 213 阅读 · 0 评论 -
数据结构-Treap(树堆) 详解
Treap(树堆)是一种弱平衡的搜索树,与平衡树相同,Treap就是由Tree和Heap(树和堆)两种数据结构组合而成的数据结构。Treap的每个节点上要额外储存一个值prioritypriority,代表每个节点的优先级。因此对于每个节点,不仅要满足二叉搜索树的基本性质,还需额外满足父节点的prioritypriority大于两个子节点的prioritypriority。实际上,这个prioriotypriorioty值又被称为"修正值"。原创 2021-06-09 22:03:34 · 4759 阅读 · 12 评论 -
数据结构-平衡树
数据结构-平衡树???? | Powered By HeartFireY | Balanced Tree???? | 需要的前导知识:二叉搜索树(BST)一、概念平衡树是二叉搜索树和堆合并构成的数据结构,它满足以下性质:空树是平衡树;非空平衡树左右两个子树高度的绝对差不超过111;非空平衡树左右子树均为平衡树对一棵二叉搜索树进行查询/新增/删除等操作,所花的时间与树的高度hhh成比例,如果二叉搜索树退化为链,那么h=nh = nh=n,此时时间复杂度最差。因此让树尽可能的维持矮平的状态有原创 2021-06-07 22:40:18 · 387 阅读 · 1 评论 -
数据结构-二叉搜索树 详解
一、二叉搜索树 简介二叉搜索树(BST, Binary Search Tree)是一种基于二叉树的树形数据结构,定义(满足的性质)如下空树是二叉搜索树若二叉搜索树的左子树不为空,则其左子树上所有点的权值均小于其根节点的权值;若二叉搜索树的右子树不为空,则其右子树上所有点的权值均大于其根节点的权值;二叉搜索树的左右子树均为二叉搜索树不难发现,二叉搜索树是采用递归进行定原创 2021-06-06 21:42:32 · 2336 阅读 · 0 评论 -
数据结构-单调栈
单调栈即为满足单调性的栈结构。与栈相似,只允许在一端进行进出操作。单调栈可以用于寻找下一个最大数,也可寻找下一个最小数,以及建立在这基础上的更高级的模型。二、单调栈的结构与操作1.插入操作将一个元素插入单调栈时,为了维护栈的单调性,需要在保证将该元素插入到栈顶后整个栈满足单调性的前提下弹出最少的元素。例如,栈中自顶向下的元素为 1,3,5,10,30,50原创 2021-06-05 23:00:42 · 322 阅读 · 2 评论 -
数据结构-ZKW线段树 详解
一、ZKW线段树简介ZKW线段树是由清华大学张昆玮所创立的一种线段树储存结构,由于其基于非递归的实现方式以及精简的代码和较高的效率而闻名。甚至,ZKW线段树能够可持久化。我们从算法的角度对基础线段树进行分析:其实线段树算法本身的本质仍是统计。因此我们可以从统计的角度入手对线段树进行分析:线段树是将一个个数原创 2021-06-04 23:47:40 · 3251 阅读 · 3 评论 -
数据结构-划分树 详解
划分树是一种用于解决区间第KK大的数据结构。相比于主席树,其常数、理解难度都较低。但划分树是紧贴"区间第KK大"定义的基于排序的数据结构,在解决此类问题上具有优异的性质,而对于其他问题则体现出局限性。划分树定义为,它的每一个节点保存区间[lft,rht][lft,rht]所有元素,元素顺序与原数组(输入)相同,但是,两个子树的元素为该节点所有元素排序后 个进入左子树,其余的到右子树,原创 2021-06-03 23:56:57 · 865 阅读 · 5 评论 -
可持久化字典树 详解
**字典树**是一种利用边权映射到字符集,将字符串保存到一棵树上的数据结构,在查询公共前缀、字符串排序、词频统计方面有着十分优秀的性质。**可持久化字典树在可持久化方式上与可持久化字典树十分相似**,即每次只修改被添加或值被修改的节点,而保留没有被改动的节点,在上一个版本的基础上连边,使最后每个版本的 Trie 树的根遍历所能分离出的 Trie 树都是完整且包含全部信息的。在字典树的拓展部分学习过程中,我们提到了一种特殊的字典树:**0-1 Trie**,而在可持久化字典树中,大部分题目都是以0-1原创 2021-06-02 22:20:19 · 1264 阅读 · 3 评论 -
可持久化线段树 主席树 详解
可持久化线段树 主席树 详解一、可持久化线段树 简介可持久化线段树,顾名思义,即对线段树进行可持久化处理之后的线段树。在可持久化数据结构的理论中,我们对可持久化的概念有所了解:“可以返回之前的某个状态,并在该基础上进行修改”。原创 2021-06-01 23:19:48 · 1834 阅读 · 1 评论 -
离散化 详解
一、简介离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。离散化本质上可以看成是一种哈希 ,其保证数据在哈希以后仍然保持原来的全/偏序关系。通俗地讲就是当有些数据因为本身很大或者类型不支持,自身无法作为数组的下标来方便地处理,而影响最终结果的只有元素之间的相对大小关系时,我们可以将原来的数据按照从大到小编号来处理问题,即离散化。用来离散化的可以是大整数、浮点数、字符串等等。为什么要进行离散化处理?离散原创 2021-05-31 22:41:00 · 2325 阅读 · 0 评论 -
数据结构 线段树--权值线段树 详解
一、权值线段树 简介1.线段树线段树是一种用于维护区间信息的高效数据结构,可以在 O(logN)O(\log N)O(logN) 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。线段树维护的信息必须满足可加性,即能以可以接受的速度合并信息和修改信息,包括在使用Lazy标记时,标记也要满足可加性具体有关线段树的的讲解请参考博客:线段树 详解与模板原创 2021-05-29 11:27:22 · 10999 阅读 · 16 评论 -
可持久化数据结构 理论
一、可持久化数据结构简介可持久化数据结构(Persistent data structure)总是可以保留每一个历史版本,并且支持操作的不可改变性(immutable)。二、可持久化分类1.部分可持久化 (Partially Persistent)所有的版本均可访问,但是只有最新版本可以修改2.完全可持久化 (Fully Persistent)所有版本均可即访问又修改。若支持将两个历史版本合并,则又称为汇合可持久化 (Confluently Persistent)。三、实际应用1.几何计算原创 2021-05-28 09:24:54 · 505 阅读 · 0 评论 -
博弈论 详解
博弈论 ,是经济学的一个分支,主要研究具有竞争或对抗性质的对象,在一定规则下产生的各种行为。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。对于算法竞赛中的博弈问题,一般具有以下特征:博弈模型为两人轮流决策的非合作博弈。即两人轮流进行决策,并且两人都使用最优策略来获取胜利。博弈是有限的。即无论两人怎样决策,都会在有限步后决出胜负。公平博弈。即两人进行决策所遵循的规则相同。本文针对常见的几种博弈:巴什博弈、威佐夫博弈、斐波那契博弈、NIM博弈以及解决公平组合博弈的SG函数定理进行解原创 2021-05-27 23:57:07 · 10883 阅读 · 2 评论 -
搜索-迭代加深搜索、IDA*算法
文章目录一、迭代加深搜索1.迭代加深搜索 简介2.迭代加深搜索的基本步骤3. 伪代码描述4.适用场景二、IDA*搜索1.IDA*搜索 简介2.伪代码3.优点/缺点1).优点2).缺点三、例题1.DNA Sequence一、迭代加深搜索1.迭代加深搜索 简介迭代加深是一种 每次限制搜索深度的 深度优先搜索(DFS)。它的本质还是深度优先搜索,只不过在搜原创 2021-05-26 23:57:09 · 1423 阅读 · 0 评论 -
A*算法 详解与例题
A*搜索(A\* Search Algorithm),是一种在图形平面上,对于有多个节点的路径求出最低通过成本的算法。它属于图的遍历和最佳有限搜索算法,同时也是BFS算法的改进之一。原创 2021-05-25 22:18:51 · 5992 阅读 · 2 评论 -
Trie 字典树 详解
一、字典树1.字典树简介字典树,英文名Trie,如其名:就是一棵像字典一样的树。我们首先通过一张图来理解字典树的结构:我们假定结点的顺序按照图中给定的顺序进行编号,容易发现,在一个给定的树上,从每个根节点出发到达子节点的路径边代表一个字母。实际上,每个节点出发的几条边所代表的字母是从左到右的顺序按照字典序排列的。那么我们可以知道:从根节点出发,到达某个指定的结点的路径可以构成一个字...原创 2021-05-24 21:23:00 · 5680 阅读 · 6 评论 -
数据结构_树状数组 详解
数据结构_树状数组 详解一、简介/前导1.前导2.简介二、树状数组 详解1.区间查询 详解2.单点修改 详解3.两种操作的具体实现三、树状数组 总结1.树状数组 - 区间加 区间求和2.树状数组 - O(logn)O(\log n)O(logn)查询第kkk小/大元素3.时间戳优化一、简介/前导1.前导我们来关注这样一个问题:要求对一个数组实现单点修改、区间原创 2021-05-23 22:56:31 · 334 阅读 · 0 评论 -
训练准备--这是一篇水博客以及分割线
如题,这是一篇用来水的博客,同时也是用分割旧博客核心博客的分割线 鸽差不多一个月没有写博客,当然也不是完全没有写,很多博客写到一半就鸽了没有写到底。同时训练的状态也很低迷。。。. 不能继续鸽下去了! 先定个小目标,每天一篇优质博客或题解 手动\doge ...原创 2021-05-22 20:00:07 · 114 阅读 · 2 评论 -
数据结构_线段树 详解+模板
线段树 详解一、线段树简介线段树是算法竞赛中常用的用来维护 区间信息 的数据结构。线段树可以在 O(logN)O(\log N)O(logN) 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。线段树维护的信息,需要满足可加性,即能以可以接受的速度合并信息和修改信息,包括在使用Lazy标记时,标记也要满足可加性注:可加性表示运算能否合并,例如取模就不满足可加性,对444 取模然后对 333 取模,两个操作就不能合并在一起做。二、线段树的基本结构1.原创 2021-04-07 23:38:37 · 1136 阅读 · 0 评论 -
数论-欧拉函数 学习笔记
一、欧拉函数1.欧拉函数的定义欧拉函数(Euler’s totient function),即 φ(n)\varphi(n)φ(n),表示的是小于等于 nnn 和 nnn 互质的数的个数。比如说 φ(1)=1\varphi(1) = 1φ(1)=1。当 n 是质数的时候,显然有 φ(n)=n−1\varphi(n) = n - 1φ(n)=n−1。2.欧拉函数的一些性质欧拉函数是积性函数。积性是什么意思呢?如果有 gcd(a,b)=1\gcd(a, b) = 1gcd(a,b)=1,那么原创 2021-04-04 16:47:20 · 383 阅读 · 0 评论 -
数论-费马小定理 学习笔记
费马小定理 学习笔记1.定理内容如果p是一个质数,而整数a不是p的倍数,则有ap−1≡1(modp)a^{p - 1} \equiv 1 \pmod{p}ap−1≡1(modp)。即:若 ppp 为素数,gcd(a,p)=1\gcd(a, p) = 1gcd(a,p)=1,则 ap−1≡1(modp)a^{p - 1} \equiv 1 \pmod{p}ap−1≡1(modp)。第二种表述形式:对于任意整数 aaa,有 ap≡a(modp)a^p \equiv a \pmod{p}ap≡a(mod原创 2021-04-04 16:46:46 · 244 阅读 · 0 评论 -
矩阵快速幂 算法原理与模板
一.前导知识(线性代数)1.矩阵乘法※运算公式[a11a12...a1na21a22...a2n............an1an2...ann] ⋅ [b11b12...b1nb21b22...b2n............bn1bn2...bnn] = [c11c12...c1nc21c22...c2n............cn1cn2...cnn]⟨cij=∑k=1naik∗bkj⟩\begin{bmatrix}a_{11}&a_{12}&a原创 2021-03-30 20:28:35 · 336 阅读 · 0 评论 -
最小生成树_详解(C++描述、Python描述)
⚪ 本文内容基于C++和Python讲解最小生成树相关的知识以及相关的算法⚪ 本文原创,转载请联系作者,并注明出处⚪ 由于作者水平有限,可能内容存在谬误,欢迎读者批评指正一、关于树的定义本定义适用于有根树和无根树森林(forest):每个连通分量(连通块)都是树的图。按照定义,一棵树也是森林。生成树(spanning tree):一个连通无向图的生成子图,同时要求是树。也即在图的边集中选择 n−1n - 1n−1 条,将所有顶点连通。结点的深度(depth):到根结点的路径上的边数。树原创 2021-03-04 20:13:51 · 921 阅读 · 3 评论 -
二叉树的遍历及根据遍历反推树的方法详解
二叉树的遍历及根据遍历构建二叉树的方法 详解一、前导-关于树的定义森林(forest):每个连通分量(连通块)都是树的图。按照定义,一棵树也是森林。生成树(spanning tree):一个连通无向图的生成子图,同时要求是树。也即在图的边集中选择 n−1n - 1n−1 条,将所有顶点连通。结点的深度(depth):到根结点的路径上的边数。树的高度(height):所有结点的深度的最大值。无根树的叶结点(leaf node):度数不超过 111 的结点。有根树的叶结点(原创 2021-03-02 23:03:33 · 3614 阅读 · 6 评论 -
图论02.最小生成树_学习笔记+模板 - 副本
一、定义与性质● 需要的前导知识点生成子图生成树● 性质我们定义无向连通图的 最小生成树 (Minimum Spanning Tree,MST)为边权和最小的生成树。注意:只有连通图才有生成树,而对于非连通图,只存在生成森林。二、最小生成树算法与模板1.Kruskal 算法Kruskal算法是一种常见而且好写的最小生成树算法,本质属于贪心算法;基本思想:从小到大加入边适用于稀松图,稠密图应该用Prim算法需要前导知识:并查集、贪心算法、图的储存方式如果使用 O(mlogm)原创 2021-02-28 16:09:39 · 282 阅读 · 0 评论 -
图论01.最短路专题_学习笔记+模板
图论01.最短路专题_学习笔记+模板一、定义与性质● 需要的前导知识点路径最短路有向图中的最短路、无向图中的最短路单源最短路、每对结点之间的最短路● 最短路的性质对于边权为正的图,任意两个结点之间的最短路,不会经过重复的结点。对于边权为正的图,任意两个结点之间的最短路,不会经过重复的边。对于边权为正的图,任意两个结点之间的最短路,任意一条的结点数不会超过 nnn ,边数不会超过 n−1n-1n−1 。二、最短路算法与模板1.Floyd–适用于无负环图的最短路算法用于求解图中任原创 2021-02-24 20:21:44 · 1937 阅读 · 0 评论 -
数据结构学习笔记-2.2:C++ STL 容器、关联容器、容器适配器
⚪ 本文内容主要讲解C++ STL容器在竞赛中的使用⚪ 本文参考资料:Cppreference (受支持的C++规范均已标明)array` (C++11)std::array 是 STL 提供的 内存连续的 、 固定长度 的数组数据结构。其本质是对原生数组的直接封装。为什么要用 arrayarray 实际上是 STL 对数组的封装。它相比 vector 牺牲了动态扩容的特性,但是换来了与原生数组几乎一致的性能(在开满优化的前提下)。因此如果能使用 C++11 特性的情况下,能够使用原生数组的地原创 2021-01-30 09:09:35 · 317 阅读 · 0 评论 -
数据结构学习笔记-2.1:C++ STL 容器-vector
⚪ 本文内容主要讲解C++ STL容器在竞赛中的使用⚪ 本文参考资料:Cppreference (受支持的C++规范均已标明)2.1、std::vector1.前导相比于静态数组,vector对于内存的动态处理通常要耗费更多的内存、时间。在效率方面显然不如数组来的方便(数组也可以通过淘汰申请内存扩展长度、动态声明长度,但我们一般不这么做)。因此在算法竞赛中正常储存数据时,我们一般不使用Vector,但在针对特定的题目时,vector的优秀特性又可以帮助我们更快、方便的解决题目,在此之前,我们需要原创 2021-01-28 19:27:44 · 384 阅读 · 1 评论 -
数据结构学习笔记-1:C++ STL标准库简介
数据结构学习笔记-1:C++ STL标准库简介⚠ 资料摘选自 0i-wiki、C++ Reference 、C++参考手册、维基百科、Boost官网,仅作个人学习使用,侵删一、前导1、C++ 标准首先需要介绍的是 C++ 本身的版本。由于 C++ 本身只是一门语言,而不同的编译器对 C++ 的实现方法各不一致,因此需要标准化来约束编译器的实现,使得 C++ 代码在不同的编译器下表现一致。C++ 自 1985 年诞生以来,一共由国际标准化组织(ISO)发布了 5 个正式的 C++ 标准,依次为 C++原创 2021-01-28 11:17:35 · 423 阅读 · 0 评论 -
动态规划-总结分析
❁声明:本文非完全原创性,其中参考资料摘自OI-WIKI:http://oi-wiki.com/dp/basic/,如有侵权,请联系我删除!动态规划应用于子问题重叠的情况:1. 要去刻画最优解的结构特征;2. 尝试递归地定义最优解的值(就是我们常说的考虑从 $i - 1$ 转移到 $i$ );3. 计算最优解;4. 利用计算出的信息构造一个最优解。本文对动态规划进行详细的讨论和展开,可以作为学习、复习参考原创 2021-01-22 22:59:48 · 609 阅读 · 0 评论 -
基本算法-03前缀和与差分 学习笔记
一、前缀和对于一个给定的数列A,它的前缀和数列S时通过递推能求出的基本信息之一。S[i]=∑j=1iA[j]S[i] = \sum_{j = 1}^i A[j]S[i]=j=1∑iA[j]一个部分和,即数列A某个下标区间内的和,可以表示为前缀和相减的形式;sum(l,r)=∑i=lrA[i]=S[r]−S[l−1]sum(l, r) = \sum_{i = l}^r A[i] = S[r] - S[l - 1]sum(l,r)=i=l∑rA[i]=S[r]−S[l−1]在二维数组中,可原创 2020-12-06 23:04:25 · 324 阅读 · 0 评论 -
基本算法-02递推与递归 学习笔记
基本算法-02递推与递归 学习笔记一、理论与概述宏观描述:对于一个待求解的问题,当它局限在某边界、某个小范围或者某种特殊情形下时,其答案往往时已知的。如果能够将该解答的应用场景扩大到原问题的状态空间,并且扩展过程的每个步骤具有相似性,就可以考虑使用递推和递归求解。以已知的“问题边界”为起点向“原问题”正向推导的扩展方式就是递推当推导的路线难以确定,这时以“原问题”为起点尝试寻找把状态空间缩小到已知的“问题边界”的路线,再通过该路线反向回溯的遍历方式就是递归使用递推、递归要求“原问题”与“原创 2020-12-06 23:03:54 · 254 阅读 · 0 评论 -
基本算法-01位运算 学习笔记
一、基本运算1.按位与运算按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。按位与的两种经典应用:让某一位或某些位为0 : X & 0XFE取一个数中的一段 : X & 0XFF2.按位或运算按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。按位或的两种经典应原创 2020-12-06 23:03:27 · 417 阅读 · 0 评论 -
深度优先搜索(DFS) 总结(算法+剪枝+优化总结)
深度优先搜索(DFS) 总结(算法+剪枝+优化总结)本文中会引用部分实例、文献资料来自不同的作者之手,由于资料整理比较困难,转载地址不在文中列举。如有侵权请联系我更换或删除!对于提供题解思路的各位大佬和作者:非常感谢!一、前导定义上的深度优先搜索的思路与树的先序遍历非常相似,是针对图的搜索而提出的一种算法,下面是算法导论上的解释:在深度优先搜索中,对于最新发现的顶点,如果它还有以此为顶点而未探测到的边,就沿此边继续探测下去,当顶点v的所有边都已被探寻过后,搜索将回溯到发现顶点v有起始点的那些边原创 2020-11-10 17:31:40 · 65914 阅读 · 16 评论