# Algorithm
算法复杂度,建议不超过n的范围
O(logn) long long内都能运行,long long数值小于10^18
O(n) 不超过10^7
O(nlogn) 10^5-5*10^5
O(n^2) 1000-5000
O(n^3) 200-500
O(2^n) 20-24
O(n!) 12
二分查找与二分答案
二分查找:查目标值的下标
(1)常用函数:binary_search() ,lower_bound() , upper_bound()
(2)注意事项:只有有序序列才能二分查找(要先排序);
二分答案:对一定的值域查找答案(值域是不需要排序的), 本来就有序
(1)求最大到最小
(2)求最小到最大
贪心算法大部分要先进行排序
数据结构
(1)队列:先进先出,后进后出,通常用在bfs(广度优先)算法,拓扑排序
(2)栈: 后进先出,先进后出,通常用在dfs(深度优先)算法,拓扑排序
(3)图:图是节点和边的集合,树是图的子集,因此图的一些算法也适合树
a.图的分类:有向图与无向图,有权图与无权图,稀疏图和稠密图,无环图(通常指有向无环图)
b.图的存储:
1.)边的集合法,其记录节点数,边数, 每条边的起点和终点。最基本最简单的方法,但是寻找邻居点麻烦,需要转换成邻接矩阵或用数组模拟邻接表
2.)邻接矩阵(二维数组),其记录任意两点之间是否存有边。简单容易理解,但有很多冗余数据,时间复杂度高,适合存储稠密图
3.)数组模拟邻接表,其只记录存有边的两点,不容易理解,但无冗余数据,时间复杂度低,适合存储稀疏图
i:方法一:普通数组实现(实现起来麻烦,能看懂即可)
ii:方法二:动态数组实现(实现起来简单,必须掌握)
c.图的遍历
1.)深度优先搜索,关键操作是父亲出栈,孩子入栈,以及合法孩子的判断
2.)广度优先搜索,关键操作是父亲入栈,孩子出栈,以及合法孩子的判断
3.)图的拓扑排序
4.)最短路径,重点掌握Floyd算法、SPFA算法
5.)最小生成树:重点掌握Kruskal算法,用到并查集排序算法,期时间复杂度为n*logn