![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
theSunAndSnow
雕栏玉砌应犹在,只是朱颜改。
展开
-
01背包
01背包特点:每个物品最多仅能用一次。问题描述:从 N 个物品里选择总体积不超过 V 的物品的最大价值。DP 和暴搜一样会枚举所有方案,当时 DP 的方式更省时。背包问题 实际上是 组合问题(选择模型) 的一种,所以当看到组合问题时,就要考虑是不是背包问题了。01背包问题有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 ii 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整原创 2020-11-27 20:50:20 · 293 阅读 · 0 评论 -
Dijkstra求最短路
Dijkstra求最短路如果图中存在负权边,则不要使用 Dijkstra 来求最短路。重边和自环如果题目中表明所给的图存在重边与自环。在求最短路径的问题中,如果自环边权重是 正数,显然它不会出现在最短路径中。如果自环边是 负数,则需要考虑出现在最短路中。如果是稠密图,使用了邻接矩阵来存边,则因为求最短路,所以我们对于重边,只需要存储最小的那个重边即可。 但如果是稀疏图,使用了邻接表来存边的话,则不需要对重边进行特殊处理。朴素版 Dijkstra 算法一般需要使用朴素版 Dijkstra原创 2020-11-27 20:48:25 · 664 阅读 · 1 评论 -
Bellman-Ford
Bellman-FordBellman-Ford 算法的证明Bellman-Ford 算法各方面都没有 SPFA 算法优良,但是有些题只能用 Bellman-Ford 算法来求,SPFA 算法要求图中不存在负环。不过,只要图中没有负环,都可以使用 SPFA,绝大部分算法题求最短路都没负环。Bellman-Ford 算法对边的存储不太敏感,你甚至可以不使用邻接表或邻接矩阵存边,直接使用一个结构体一维数组也行。struct Edge { int a, b, w}edges[M];Bellman-原创 2020-11-27 20:42:57 · 282 阅读 · 0 评论 -
树与图的存储
树与图的存储我们在算法比赛中都是以数组来模拟 树 与 图。我们常常使用 链表 与 邻接表来存储树与图。常常看到有人使用结构体来实现链表和邻接表,但是这只适用于面试,不适用与笔试。这是因为每次创建一个新的节点都需要调用 new 函数,然而 new 函数效率是非常低的。低到什么程度?一般题目节点有 10 万 到 100 万,然而你仅仅是 new 10万个节点就有可能超时了……当然,你一开始初始化 10 万个节点,这个倒是可以,但是这和数组就区别不大了。数组模拟链表(又称为 静态链表)最主要的好处就是快。原创 2020-11-27 20:40:50 · 648 阅读 · 2 评论 -
STL堆与手写堆
堆堆的特点插入一个数;求集合中的最小值;删除最小值;以上是堆的最基本的特性,C++ STL 实现的小根堆支持上述操作。删除任意一个元素;修改如意一个元素;以上两个特性 STL 堆无法直接实现,但是可以间接实现。堆是一个完全二叉树。以小根堆为例子,每个节点的值都小于等于两个子节点。所以根节点是集合的最小值。STL 堆STL 堆就是 优先队列。并且实现的堆是 小根堆。定义:#include <queue>typedef pair<int, int>原创 2020-11-27 20:38:17 · 362 阅读 · 1 评论 -
快速幂
快速幂应用场景所谓的快速幂就是迅速地求出 akmodpa^{k} mod pakmodp 的结果,时间复杂度是 O(logk)O(logk)O(logk) ,其中 1≤a,p,k≤1091 \leq a,p,k \leq 10^{9}1≤a,p,k≤109 。正常情况下,我们求 akmodpa^{k} mod pakmodp ,其中 1≤a,p,q≤1091 \leq a, p, q \leq 10^{9}1≤a,p,q≤109 。使用的是一个 for 循环,时间复杂读度是 O(k)O(k)O(k)原创 2020-11-27 20:36:16 · 298 阅读 · 0 评论 -
DFS
DFSDFS 与 BFS 时间复杂度相同,都是 O(n+m)O(n + m)O(n+m),其中 n 表示图的节点数,m 表示图的边数。相比于 BFS,DFS 代码量比 BFS 短很多,但是缺点是有可能 爆栈。从实际应用来看,能用 dfs 解决,就不要用 bfs 了。DFS 会遍历所有的节点,但往往 BFS 不需要这样。树与图的 DFS树(不是图)的 DFS 有一个 特点:可以在 DFS 树的过程中求出每一个节点为根节点的子树的节点数量。这是因为树的 DFS 不会深搜上面的点,只能搜索下方的点,又原创 2020-11-27 20:35:14 · 131 阅读 · 0 评论 -
BFS
BFSBFS 与 DFS 的时间复杂度相同,都是 O(n+m)O(n + m)O(n+m),其中 n 表示图的节点数,m 表示图的边数。当树或者图的所有边的权重都是 1 时,才可以使用 BFS 求最短距离,否则应该使用 DFS 考虑所有情况。当权重不是 1 的时候,应该使用 Dijkstra 等算法来求最短距离。BFS 原理队列 —> 先进先出 —> BFS栈 —> 后进先出 —> DFS所有的 BFS、DFS 都可以对应一颗树。bfs 遍历顺序:bfs 实现遍历主原创 2020-11-27 20:31:00 · 3897 阅读 · 0 评论 -
树状数组
树状数组线段树问题集合包含数树状数组,这意味着树状数组能解决的问题线段树往往也能解决。虽然用法上,线段树比树状数组丰富很多,但是树状数组也有它的优势:1. 代码短;2. 运行效率很高(相对于线段树,常数非常小,大部分情况下能差 10 倍左右,如果是简单问题的话,常数会差的稍微少一些。)方法选择上,如果能用树状数组来做,就不要用线段树。树状数组树状数组的作用可以动态、快速地(O(log n))求前缀和,我们一般情况下就是用树状数组来求前缀和的 ~动态、快速地求前缀和:设原数组为 a,其对应的前原创 2020-11-27 20:27:14 · 407 阅读 · 0 评论 -
前缀和
前缀和使用场景求一个静态数组某个区间内所有数的和 的时候,我们便可以使用前缀和,有效提高运行效率。前缀和 是非常重要的一个思想,在很多问题中都会用到。当然,快速地求某一段数的和,也有其它算法可以优化,比如树状数组、线段树。区别在于:前缀和时间复杂度为 O(1),线段树与树状数组都是 O( logn ) 。前缀和只能处理静态数组,这意味着被前缀和的数组的每个元素如果改变,前缀和的结果依旧是旧值的和。但是线段树与树状数组却可以一起动态改变。时间效率更高,往往意味着会损失一些东西。使用步骤定义原创 2020-09-20 18:53:42 · 455 阅读 · 0 评论 -
二分算法
二分算法实数二分不需要考虑是否补 1 的问题,因此相对而言更简单。有单调性则一定可以二分,能二分却不一定具有单调性。没有单调性也可能可以二分。整数二分思想整数二分特别容易出现死循环。确定一个区间,使得目标值(答案)一定在区间中。找一个性质,这个性质具有二段性(95% 的二分都具有二段性):所谓的二段性就是区间内每个点都可以判断是否具有这个性质,并且利用这个性质,可以将一个区间划分为连续的两个部分,前半段区间满足性质,后半段不满足此性质,中间没有缺失的地方。 答案必须是二分的分界点。原创 2020-09-19 10:24:25 · 392 阅读 · 0 评论