- 博客(31)
- 收藏
- 关注
原创 安装Ubuntu 20.04虚拟机
使用 VMware Workstation Pro 17 安装 Ubuntu 20.04 LTS amd64 虚拟机
2024-02-17 19:30:59
991
原创 树形DP
树一大特点就具有子结构,而DP也是要求最优子结构,并且两者都有相同的基本操作——“递归”,那么可见这两者就可以非常和谐的结合在一起了。由于只需要从上向下递归更新子树的父结点,所以并不需要双向建边。树形DP,字面意思,在树结构上的DP,通常。(此状态根据题意有不同意义)时的最优解。我们暂且先讨论前者。
2023-10-08 23:24:27
79
原创 进制转换
也称为计数制,是一种计数的方法,是用一组固定的符号和统一的规则来表示数值的方法。在计数过程中采用进位的方法称为,包括和三个要素。:指数字符号在一个数中所处的位置。:指在某种进位计数制中数位上所能使用的数字符号的个数。例如十进制的基数为10:数制中某一位上的1所表示数值的大小(所处位置的价值)。例如十进制的2301的位权是1002的位权是103的位权是1。
2023-08-28 18:39:07
151
原创 搜索优化-剪枝
众所周知,搜索的算法时间复杂度大多是指数级的。即使是简单的不加优化的搜索,其时间效率也低得让人无法忍受,难以满足我们竞赛时对程序的运行时间的要求。所以建立算法结构之后,有一种对程序进行优化的基本方法——剪枝。所谓剪枝,就是通过某种判断,避免不必要的的遍历过程,形象的过程。
2023-07-21 14:31:29
691
原创 二分
二分查找(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是用来在一个有序数组中查找某一元素的算法。
2023-07-18 11:50:33
86
原创 贪心算法
贪心算法,又名贪婪法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好/最优的解。{看着这个名字,贪心,贪婪这两字的内在含义最为关键。这就好像一个贪婪的人,他事事都想要眼前看到最好的那个,看不到长远的东西,也不为最终的结果和将来着想,贪图眼前局部的利益最大化,有点走一步看一步的感觉。
2023-07-14 13:53:47
84
原创 双指针之尺取法
又叫双指针法,所谓尺取法,是枚举区间的时候的一种优化思想。我们顾名思义地理解,就像是在一个数轴上,用尺慢慢地取。用比较学术的话来讲,就是取一对数组下标(即区间左右端点),根据题目要求和实际情况不断地推进左右区间得出答案。你可能会说,这不就是暴力枚举么?是的,不过它在处理区间的时候的效率要比一般的暴力枚举高很多很多。尺取法通常适用于选取区间有一定规律,或者说所选取的区间有一定的变化趋势的情况,比如单调性的区间就是经常用到尺取法的经典区间。
2023-07-13 16:28:59
69
原创 栈和队列
stack是一种后进先出的容器结构,准确来说stack并不是容器,而是一种容器适配器(对特定类封装作为其底层的容器)。队列是一种后进后出的容器适配器结构,标准容器类deque和list满足其要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque(双端队列)。优先队列是一种容器适配器,根据严格的弱排序标准(默认情况),它的第一个元素总是它所包含的元素中最大的。简单来说,priority_queue类似于数据结构中的堆,其使用与实现也和堆(Heap)并无二异。
2023-07-13 11:52:53
112
原创 STL map
map 是 C++ STL(标准模板库)的一部分。map是存储排序的键值对的关联容器,其中每个键都是唯一的,可以插入或删除,但不能更改。但是与键关联的值可以更改。
2023-07-13 09:36:57
118
1
原创 STL set
include <set> // set属于std命名域的,因此需要通过命名限定,例如using std::set;// 定义一个int类型的集合a // set<int> a(10);// error,未定义这种构造函数 // set<int> a(10, 1);// error,未定义这种构造函数 set < int > b(a);// 定义并用集合a初始化集合b set < int > b(a . begin() , a . end());// 将集合a中的所有元素作为集合b的初始值。
2023-07-13 09:10:28
74
1
原创 链表
包含单链表,双链表,循环单链表,实际应用中的功能不同,但实现方式都差不多。单链表就像是美国男篮,一代一代往下传;双链表像是中国男足,你传球给我,我传球给你,最终传给了守门员;循环链表就像是中国男篮,火炬从姚明传给王治郅,王治郅传给易建联,现在易建联伤了,又传给了姚明单链表是指结点中只有一个指向其后继的指针,具有单向性,但是有时需要搜索大量数据的时候,就需要多次进行从头开始的遍历,这样的搜索就不是很高效了。
2023-07-12 10:37:24
52
1
原创 倍增 LCA RMQ
兔子跳:很多时候,倍增思想的使用过程就像兔子跳跃的过程一样(设兔子单次跳跃的距离为ddd,假设在每次跳跃完成后,dd2d=d^2dd2) .学习这只兔子的跳跃过程,我们就可以尝试把极高的时间复杂度优化成Onlog2nOnlog2n对数据查询的优化:倍增很多时候是在查询过程中使用的(单次查询的时间复杂度通常为O1O(1)O1至Olog2nOlog2n.在查询速度优化的同时,往往也需要对数据的预处理.Onlog2n。
2023-06-13 07:23:29
57
原创 并查集
并查集的重要思想在于,。我曾看过一个有趣的比喻,把集合比喻成,而代表元素则是。接下来我们利用这个比喻,看看并查集是如何运作的。最开始,所有大侠各自为战。他们各自的帮主自然就是自己。(对于只有一个元素的集合,代表元素自然是唯一的那个元素)现在1号和3号比武,假设1号赢了(这里具体谁赢暂时不重要),那么3号就认1号作帮主*(合并1号和3号所在的集合,1号为代表元素)*。现在2号想和3号比武*(合并3号和2号所在的集合),但3号表示,别跟我打,让我帮主来收拾你(合并代表元素)*。
2023-06-01 17:05:27
51
原创 单调队列
单调队列从字面上看,无非就是有某种单调性的队列,没错,这就是所谓的单调队列。i=7->{ 8,9, 10}(表示i=6,时,在其范围内最小的值为8)-> 3比单调队列为{ 8,9, 10} 的任意值都小,故全out,最终集合为 { 3 };i=5-> {6, 8 , 12}(表示i=4,时,在其范围内最小的值为6)-> 9比12小,12out,9比8大,9进 {6,8, 9};i=6-> {6,8, 9} 但是 单调队列中元素6的下标是2,不在(2, 6],中,故6 out,这就是单调队列的精髓了。
2023-05-28 09:49:52
38
原创 Bellman-Ford
其主要思想:对所有的边进行n-1轮松弛操作,因为在一个含有n个顶点的图中,任意两点之间的最短路径最多包含n-1边。换句话说,第1轮在对所有的边进行松弛后,得到的是源点最多经过一条边到达其他顶点的最短距离;但是SPF的算法复杂度没有传说中的那么稳定,随着数据的不同可能降为传统 Bellman-Ford的复杂度,而后者的实现难度远低于前者。其中, n为顶点的个数,m为边的个数,edges数组储存了所有边,distance数组是源点到所有点的距离估计值,循环结束后就是最小值。那么我们怎么去判断有没有负权回路呢?
2023-05-28 08:31:31
115
原创 Floyd
Floyd 算法是 所有点到所有点 的最短路径的算法,阅读前请想了解图的数据结构「邻接矩阵」Floyd 算法是一个基于「贪心」、「动态规划」求一个图中最短路径的算法,时间复杂度On3。
2023-05-28 08:18:41
65
原创 Dijkstra
Dijkstra 算法是求一个图中一个点到其他所有点的最短路径的算法,阅读前请想了解图的数据结构「邻接矩阵」Dijkstra 算法是一个基于「贪心」、「广度优先搜索」、「动态规划」求一个图中一个点到其他所有点的最短路径的算法,时间复杂度On2。
2023-05-28 07:56:54
50
1
原创 binary search(二分)
二分查找(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是用来在一个有序数组中查找某一元素的算法。
2023-05-27 19:27:08
579
1
原创 BFS(宽度优先搜索)
BFS 全称是 Breadth First Search ,中文名是宽度优先搜索,也叫广度优先搜索。是图上最基础、最重要的搜索算法之一。所谓宽度优先。就是每次都尝试访问同一层的节点。如果同一层都访问完了,再访问下一层。这样做的结果是,BFS 算法找到的路径是从起点开始的合法路径。换言之,这条路所包含的边数最小。在 BFS 结束时,每个节点都是通过从起点到该点的最短路径访问的。算法过程可以看做是图上火苗传播的过程:最开始只有起点着火了,在每一时刻,有火的节点都向它相邻的所有节点传播火苗。
2023-05-27 18:35:39
444
1
原创 DFS(深度优先搜索)
搜索是一种适用性非常广泛的算法。很多我们实际遇到的问题,数据量可能不会太大,都可以暴力搜索一把来解决。其实这个算法网上也很多但是都讲的比较复杂很多人也只能看一个前面的东西后面的其实看不懂。也有很多文章讲的不是太精炼,讲不出个所以然来。所以小编今天就利用这篇文章来带大家先入门搜索算法。最简单的 DFS 相当于一个暴力搜索算法。基本上遇到的很多题目暴力都能解决,毕竟 CPU 处理的速度这么快。
2023-05-27 17:33:26
154
1
原创 双端队列
通常队列的内部采用数组来实现,为了充分利用数组空间,使用%来实现逻辑上的循环数组,如下图所示。//统计队列是否为满或者队列是否为空 public T [ ] list;} }
2023-05-26 20:37:11
149
1
原创 类斐波那契问题
类斐波那契数列在计算机科学中有广泛的应用,比如在图形学中生成螺旋线,计算程序的复杂度等。,后续的数是前面两个数之和再加。所以类斐波那契数列的前几项为。类斐波那契数列是指第一个数为。
2023-05-26 20:25:08
200
1
原创 线性dp
种转移方法,因此一直沿着最左边往下走和一直沿着最右边往下走的路径就是数组元素之和,先处理这两个边界。最左边的部分和最右边的边界只会从是上一行的一个位置转移过来,只有。(上一行前一列),所以将状态优化为一维数组,从后往前倒推即可。结尾的最长上升序列后面,得到的长度为。的最长公共子序列长度,取二者的最大值,区间的最大连续子段和,则需要从所有。不是来自上一行,而是来自本行的更新。的最长公共子序列长度,或者把。区间的最大连续子段和,若求解。,求当前位置的最优解时,只需。列时经过的数字的最大和。
2023-05-26 19:50:40
95
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人