随笔分类 -  数据结构

摘要:我们这里讨论的是保序的离散化,小的在前面,大的在后面 我们有一个集合a[],这个集合的值域是0 ~ $10^9$,但是这个集合中元素的个数却只有$10^5$个。 当我们需要将这个集合中元素当作下标时,那么我们需要开一个$10^9$数组,这无疑是很浪费空间的。 此时就需要进行映射,将这$10^5$个数 阅读全文
posted @ 2022-06-14 20:47 晓尘 阅读(44) 评论(0) 推荐(0)
摘要:位运算常用的主要有两方面: n的二进制表示中,第k位是几。 Lowbit操作 二进制第k位 n的二进制表示中,第k位是几。 思路: 先把第k位移动到最后一位,n >> k; 看个位是几,通过n&1就可以了 总结一下,公式就是 n>>k&1 如下面输出的结果就是1010; int n = 10; fo 阅读全文
posted @ 2022-06-14 19:10 晓尘 阅读(54) 评论(0) 推荐(0)
摘要:用处就是优化 例如一道题朴素做法就是暴力遍历,如下: for(int i = 0; i < n; i++) for(int j = 0; j ⇐ i; j++) 此时时间复杂度是$O(n^2)$的。而通过双指针算法,就可以将其优化为O(n)的。 基本思想如下: for (int i = 0, j = 阅读全文
posted @ 2022-06-14 13:28 晓尘 阅读(44) 评论(0) 推荐(0)
摘要:差分就是前缀和的逆运算 一维差分 有一个数组$a_1,a_2,a_3...$ 构造$b_1,b_2,b_3...$ 使得$a_i = b_1 + b_2 + ... + b_i$. 构造方法也很简单: \(b_1 = a_1\) \(b_2 = a_2 - a_1\) \(b_3 = a_3 - a 阅读全文
posted @ 2022-06-13 16:08 晓尘 阅读(291) 评论(0) 推荐(0)
摘要:前缀和 前缀和更像一个公式,理解思想之后直接套公式就可以解题。 一维前缀和 有一个数组$a_1,a_2,a_3...$ 则前缀和数组为$S_i = a_1 + a_2 + ... + a_i$. 前缀和的下标建议从1开始。这样$S_0$就会为0,处理边界会很方便。 例如区间和[1,5]为$S_5-S 阅读全文
posted @ 2022-06-02 14:03 晓尘 阅读(89) 评论(0) 推荐(0)
摘要:1、栈(Stack) 特点:后入先出 基本操作: push(x):在栈顶部添加元素x pop(x):从栈顶部取出元素 isEmpty():检查栈是否为空 isFull():检查栈是否已满 void initialize(){ top = 0; } void isEmpty(){ return top 阅读全文
posted @ 2021-09-15 23:23 晓尘 阅读(70) 评论(0) 推荐(0)
摘要:1、线性搜索 从数组开头顺次访问各元素,检测是否与目标值相等,效率较低,但适用于任何形式的数据。 2、二分搜索 数组需要先进行排序,每次搜索完一次搜索范围都会减半 3、散列法 https://www.cnblogs.com/sunsky303/p/11865321.html https://blog 阅读全文
posted @ 2021-09-15 23:23 晓尘 阅读(342) 评论(0) 推荐(0)
摘要:######参考链接 https://windliang.wang/2019/06/24/%E4%B8%80%E6%96%87%E8%AE%A9%E4%BD%A0%E5%BD%BB%E5%BA%95%E6%98%8E%E7%99%BD%E9%A9%AC%E6%8B%89%E8%BD%A6%E7%AE 阅读全文
posted @ 2021-09-15 23:22 晓尘 阅读(18) 评论(0) 推荐(0)
摘要:DFS DFS(暴力搜索):顺序很重要,我们要以什么顺序将每个方案都遍历一遍。 例题1 递归实现排列型枚举 https://ac.nowcoder.com/acm/contest/998/C 常规做法 #include<iostream> using namespace std; const int 阅读全文
posted @ 2021-09-15 23:21 晓尘 阅读(36) 评论(0) 推荐(0)
摘要:动态规划 动态规划的优化涉及到一般就是对动态规划的代码或方程做一个等价变形 0,1背包问题 描述 N个物品和容量为V的背包,每一个物品有两个属性 {重量$w_i$,价值$v_i$}, 每件物品最多仅能用一次。 在背包能装得下的情况下,能选出的物品最大总价值为多少。 思路 先把基本的形式写出来,再一点 阅读全文
posted @ 2021-09-15 23:21 晓尘 阅读(208) 评论(0) 推荐(0)
摘要:二分 在一个区间内部去二分答案,在选择二分出的两个区间的时候都选择答案所在区间进行下一步处理, 这样可以保证区间缩小了一半并且答案也在该区间内,当区间长度为1时,区间内的数就是答案 二分的本质: 如果有单调性一定可以二分,但是可以二分的题目不一定有单调性。 边界:即定义某种性质,将整个区间一分为二, 阅读全文
posted @ 2021-04-04 17:24 晓尘 阅读(291) 评论(0) 推荐(0)
摘要:二分图就是可以把所有点划分到两边去,使得所有边都是在集合之间的,而集合内部没有边。如下图: 1.1 染色法 时间复杂度:O(n+m) 用来判断一个图是不是二分图。染色法就是一个很简单的DFS。 图论的一个性质:一个图是二分图,当且仅当这个图可以被染色。 一个图是二分图,当且仅当图中不含奇数环。环是从 阅读全文
posted @ 2021-04-04 13:39 晓尘 阅读(182) 评论(0) 推荐(0)
摘要:1、最小生成树 对应的图都是无向图,有向图一般不会考 一般稠密图直接朴素版Prim算法,因为短。 稀疏图就直接Kruskal算法。 堆优化版本的Prim算法一般不常用。 最下生成树有什么用:如我们有n个城市,在不同城市之间修路,让这些城市可以相互连通,则修路的最小总长度是多少。 1.1 朴素Prim 阅读全文
posted @ 2021-04-04 13:35 晓尘 阅读(116) 评论(0) 推荐(0)
摘要:可以分为两类: 单元最短路 求从一个点到其他所有点的最短距离,如从1号点到n号点的最短路 多源汇最短路 起点和终点数量不确定 n表示图中点的数量,m表示图中边的数量,一般m~$n^2$是稠密图 朴素Dijkstra适合稠密图,如边数比较多和$n^2$一个级别用朴素Dijkstra m和n是一个级别, 阅读全文
posted @ 2021-04-04 13:28 晓尘 阅读(227) 评论(0) 推荐(0)
摘要:1、拓扑排序 有向图的拓扑序列就是图的宽度优先遍历的应用 拓扑序列是针对有向图来说的,无向图是没有拓扑序列的。 存在一个序列A,对于图中的每条边(x,y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。 举例:有如下一个有向图: A = (1,2,3)就是一个拓扑序列,原因如下: 首先看第一条 阅读全文
posted @ 2021-04-04 13:12 晓尘 阅读(425) 评论(0) 推荐(0)
摘要:1、树和图的存储 有两种存储方式,树是一种特殊的图,无环连通图。所以只讨论图的存储方式。 图分为有向图和无向图。无向图a—b可以看作有向图a$\to$b和b$\to$a,所以无向图也可以看作一种特殊的有向图。 这样只需要考虑有向图就可以了。 1.1 邻接矩阵存储 其实就是开了一个二维数组。g[a,b 阅读全文
posted @ 2021-04-04 13:11 晓尘 阅读(236) 评论(0) 推荐(0)
摘要:1、深度优先搜索DFS 不管哪条路一定要走到头,然后再往回走,往回退一步之后看看还有没有没走过的路,如果有,那么就继续对没走过的路进行DFS,如果没有就再退一步。 算法思路奇怪或者对空间要求较高用DFS。 DFS俗称暴力搜索,最重要的就是把他的顺序想明白。用一个什么样的顺序去遍历所有方案。BFS搜索 阅读全文
posted @ 2021-04-04 13:03 晓尘 阅读(184) 评论(0) 推荐(0)
摘要:有N个物品和一个容量是v的背包,每个物品有两个属性:体积$v_i$和价值$w_i$。 我们要在背包装得下的情况下让选出的物品总价值最大。 进阶可以看看背包九讲。 动态规划是没有模板的,他的代码就是一些循环,他的核心在于状态的表示和状态的转移,比较偏向于数学的思考。 1、(0,1)背包问题 每件物品只 阅读全文
posted @ 2021-04-02 12:46 晓尘 阅读(243) 评论(0) 推荐(0)
摘要:1、vector 变长数组,倍增的思想 系统为某一程序分配空间时,所需时间与空间大小无关,与请求次数有关。 #include<iostream> #include<vector> using namespace std; int main() { vector<int> a; // 定义一个vect 阅读全文
posted @ 2021-03-26 10:39 晓尘 阅读(66) 评论(0) 推荐(0)
摘要:1、概述 主要为以下两部分: 哈希表的存储结构 字符串的哈希方式 1.1 Hash表的作用 把一堆复杂的结构映射到0~N一个小一点的范围内 如把0 ~ $10^9$但是其中有很多没意义的数字,把其中有意义的数字映射到一个小范围内,如0 ~ \(10^5\)。 如下面模拟散列表的例子。 1.2 如何写 阅读全文
posted @ 2021-03-26 10:28 晓尘 阅读(204) 评论(0) 推荐(0)