1.基础数据结构:
- 栈:
-
栈
-
单调栈(比较难)
-
STL-stack(栈,一般比较慢,不用,而且栈好写,没必要)
- 队列:
-
队列
-
循环队列
-
单调队列(滑动窗口,比较难)
-
优先队列(先懂思想,这个是拿堆实现的)
-
双端队列(这个可以拿两个栈模拟,也可以用一个数组从中间开始)
-
STL-queue(循环队列,还行,有的时候用)
-
deque(双端队列,比较慢,一般不用)
-
priority_queue(优先队列,用的特别多,基本优先队列都用这个,因为手写比较麻烦)
- 链表:
-
链表
-
双向链表(循环链表)
-
邻接链表/链式前向星(一般在图论存图的时候用,这两个实质上是一个,但是理解方式不一样,抽象成数学模型长得也不一样,感觉邻接链表好理解,就是一维是数组,一维是链表)
-
STL-list(链表,很慢,而且链表很好写,一般不用)
- Hash:
-
哈希表(这个东西博大精深,实质上是数学的映射(就是函数),学这个的时候先学一下数学的映射)
-
字符串哈希(这个看着办,其实也是哈希,但是是字符串算法的一种,放到后面学也可以,其实很简单,哈希的东西很多,所以说博大精深,你先学最简单的就行了)
-
STL-map(STL实现的映射表(其实也就是哈希表),这个东西用的很多,主要是因为太方便了,但是不开O2也慢,而且拓展性不是很强(除非你写类继承))
- Trie:
-
Trie
-
01trie(就是从原来存自负,变成存二进制01串,这个串其实可以看成一个数,所以可以跑贪心)
- 堆(满足堆性质的树,支持插入,动态维护最大/最小值,删除堆顶元素(就是最大/最小值))
- 哈夫曼树
- 哈夫曼编码(实质上是贪心)
- 对顶堆(用于维护中位数,实际上是一个小技巧,但是可能不太好理解,比较难,可以先不学)
- 并查集(实质上是数学上的集合,维护的是一堆集合,每个集合有一个代表元素,支持合并两个集合,查询某个元素所在集合的代表元素)
- 路径压缩/按秩合并(并查集极其重要的两个优化,尤其是路径压缩,实际上很好写)
- 拓展域/边带权并查集(比较难,可以跳过,实质上是在并查集上进行拓展,维护了一些其他可以一起维护的东西)
学并查集的时候一定要记住一点非常非常重要的:
并查集,擅长维护一类具有传递性的关系
(传递性是一个定义在多元关系上的数学性质,多元关系就是多个元素之间的关系,比方说等于,不等于,就是二元关系,而显然等于具有传递性,因为通过a=b且b=c可知a=c,而显然不等于不具有传递性,因为若a不等于b且b不等于c,不一定a不等于c,这就是传递性(可以从图论角度理解))
2.基础算法:
- 前缀和与差分(一个互逆运算,可以把O(n)的区间修改变成O(1)的单点修改,还有其他很重要的应用)
- 排序(可以用sort,但是归并排序和基数排序要会,基数排序可以先会思像,归并排序一定要会,归并求逆序对也要会)
- 贪心(写一些简单的小题就可以。。。因为贪心难起来可以难死)
- 二分,二分答案(最重要的是注意好二分边界,不要死循环,尤其是实数域的二分,对于二分答案,开始很难理解,建议多读一下蓝皮书)
- DFS/BFS/floorfill,多写多练,DFS基于回溯,BFS基于队列,floorfill实际上就是BFS
3.图论:
- 图和树的基础定义(记熟了,别记混,像什么完全二叉树和满二叉树,高度和深度(这个先看白皮书)等等)
- 图和树的遍历(DFS/BFS)(最基础的基础,一定多看几遍蓝皮书第二章前两节,把定义记一记)(记熟定义,DFS树,深度,前中后序遍历,dfs序(一般指欧拉序,欧拉序有两种,蓝皮书上是第一种,你先学这个,可以去网上查查,两种的性质完全等价,但是记录的方式不一样,dfs序有很多很好的性质))
- 最短路(学几个名词,松弛,三角形不等式):
-
单源多汇(Dij(实质上是贪心,一定要学堆优化,不可以处理负数权值)/Ford —(队列优化)>>SPFA(可以处理负数权值,但是在图中没有负数权值的时候一定别用,会被卡T)(Ford/SPFA判负环(可以先放放,但是也很重要)))
-
多源单汇(反着建图跑单源多汇)
-
多源多汇(Floyd(基础,学好了,还有一个传递闭包,看不懂可以先不看,就是数学定义比较抽象,实际上很简单,可以问我)/Jhonson(这个比较难,可以先不学))
- 最小生成树:
-
Prim(用来解决稠密图的最小生成树,一定学堆优化,跟dij长得很像)
-
Kruskal(在稠密图会被卡,但是不是稠密图很常用,很重要)
-
Boruvka(应用联通块的思想,思想比较重要(其实是奇特,因为你不学这个你都想不到这个思想),可以看看思想,一般不写,比较冷门的算法)
- 拓扑排序(其实不是排序,就是有向图的一种遍历方式,很重要,拓扑序有良好的性质)
- 欧拉路欧拉图(比较难,而且我估计普及组不考可以先不学)