随笔分类 - 数据结构
摘要:我们这里讨论的是保序的离散化,小的在前面,大的在后面 我们有一个集合a[],这个集合的值域是0 ~ ,但是这个集合中元素的个数却只有个。 当我们需要将这个集合中元素当作下标时,那么我们需要开一个数组,这无疑是很浪费空间的。 此时就需要进行映射,将这个数
阅读全文
摘要:位运算常用的主要有两方面: n的二进制表示中,第k位是几。 Lowbit操作 二进制第k位 n的二进制表示中,第k位是几。 思路: 先把第k位移动到最后一位,n >> k; 看个位是几,通过n&1就可以了 总结一下,公式就是 n>>k&1 如下面输出的结果就是1010; int n = 10; fo
阅读全文
摘要:用处就是优化 例如一道题朴素做法就是暴力遍历,如下: for(int i = 0; i < n; i++) for(int j = 0; j ⇐ i; j++) 此时时间复杂度是的。而通过双指针算法,就可以将其优化为O(n)的。 基本思想如下: for (int i = 0, j =
阅读全文
摘要:前缀和 前缀和更像一个公式,理解思想之后直接套公式就可以解题。 一维前缀和 有一个数组 则前缀和数组为. 前缀和的下标建议从1开始。这样就会为0,处理边界会很方便。 例如区间和[1,5]为$S_5-S
阅读全文
摘要:1、栈(Stack) 特点:后入先出 基本操作: push(x):在栈顶部添加元素x pop(x):从栈顶部取出元素 isEmpty():检查栈是否为空 isFull():检查栈是否已满 void initialize(){ top = 0; } void isEmpty(){ return top
阅读全文
摘要:1、线性搜索 从数组开头顺次访问各元素,检测是否与目标值相等,效率较低,但适用于任何形式的数据。 2、二分搜索 数组需要先进行排序,每次搜索完一次搜索范围都会减半 3、散列法 https://www.cnblogs.com/sunsky303/p/11865321.html https://blog
阅读全文
摘要:######参考链接 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
阅读全文
摘要:DFS DFS(暴力搜索):顺序很重要,我们要以什么顺序将每个方案都遍历一遍。 例题1 递归实现排列型枚举 https://ac.nowcoder.com/acm/contest/998/C 常规做法 #include<iostream> using namespace std; const int
阅读全文
摘要:动态规划 动态规划的优化涉及到一般就是对动态规划的代码或方程做一个等价变形 0,1背包问题 描述 N个物品和容量为V的背包,每一个物品有两个属性 {重量,价值}, 每件物品最多仅能用一次。 在背包能装得下的情况下,能选出的物品最大总价值为多少。 思路 先把基本的形式写出来,再一点
阅读全文
摘要:1、最小生成树 对应的图都是无向图,有向图一般不会考 一般稠密图直接朴素版Prim算法,因为短。 稀疏图就直接Kruskal算法。 堆优化版本的Prim算法一般不常用。 最下生成树有什么用:如我们有n个城市,在不同城市之间修路,让这些城市可以相互连通,则修路的最小总长度是多少。 1.1 朴素Prim
阅读全文
摘要:可以分为两类: 单元最短路 求从一个点到其他所有点的最短距离,如从1号点到n号点的最短路 多源汇最短路 起点和终点数量不确定 n表示图中点的数量,m表示图中边的数量,一般m~是稠密图 朴素Dijkstra适合稠密图,如边数比较多和一个级别用朴素Dijkstra m和n是一个级别,
阅读全文
摘要:1、树和图的存储 有两种存储方式,树是一种特殊的图,无环连通图。所以只讨论图的存储方式。 图分为有向图和无向图。无向图a—b可以看作有向图ab和ba,所以无向图也可以看作一种特殊的有向图。 这样只需要考虑有向图就可以了。 1.1 邻接矩阵存储 其实就是开了一个二维数组。g[a,b
阅读全文
摘要:1、深度优先搜索DFS 不管哪条路一定要走到头,然后再往回走,往回退一步之后看看还有没有没走过的路,如果有,那么就继续对没走过的路进行DFS,如果没有就再退一步。 算法思路奇怪或者对空间要求较高用DFS。 DFS俗称暴力搜索,最重要的就是把他的顺序想明白。用一个什么样的顺序去遍历所有方案。BFS搜索
阅读全文
摘要:有N个物品和一个容量是v的背包,每个物品有两个属性:体积和价值。 我们要在背包装得下的情况下让选出的物品总价值最大。 进阶可以看看背包九讲。 动态规划是没有模板的,他的代码就是一些循环,他的核心在于状态的表示和状态的转移,比较偏向于数学的思考。 1、(0,1)背包问题 每件物品只
阅读全文
摘要:1、vector 变长数组,倍增的思想 系统为某一程序分配空间时,所需时间与空间大小无关,与请求次数有关。 #include<iostream> #include<vector> using namespace std; int main() { vector<int> a; // 定义一个vect
阅读全文
摘要:1、概述 主要为以下两部分: 哈希表的存储结构 字符串的哈希方式 1.1 Hash表的作用 把一堆复杂的结构映射到0~N一个小一点的范围内 如把0 ~ 但是其中有很多没意义的数字,把其中有意义的数字映射到一个小范围内,如0 ~ 。 如下面模拟散列表的例子。 1.2 如何写
阅读全文
摘要:3.1 概述 手写堆而不是STL的堆 STL里的堆就是优先队列priority_queue 如何手写一个堆? STL支持的操作: 插入一个值 求集合中的最小值 删除最小值 STL没办法直接实现,只能间接实现的功能: 删除任意一个元素 修改任意一个元素 3.1.1 什么是堆 堆就是一个二叉树或者说是完
阅读全文
摘要:1、概述 1.1 作用 将两个集合合并 询问两个元素是否在一个集合当中 1.2 暴力做法 用一个数组belong[x] = a存储哪个元素属于哪个集合,判断就是if(belong[x] == belong[y]),复杂度O(1) 但是当我们想合并两个集合时,假如集合a有1000个元素,集合b有200
阅读全文
摘要:作用:高效地存储和查找字符串集合的数据结构 用到Trie树的题字母类型不会很多,一定都会有限制 如想在Trie中存储如下元素: abcdef,abdef,aced,bcd,bcff,cdaa,bcdc,abc 存储方式如下: 在根节点root后,从头向后遍历,在每个单词的结尾位置做标记,如下图: 那
阅读全文