并查集:解决元素分组问题(亲戚、村村通)
优化:压缩路径和按秩合并
find
merge
双指针
环形链表 追及问题
两数之和/三数之和
二叉搜索树BST 左子树节点值小于根节点,右子树大于根节点
平衡二叉树 左子树节点值小于根节点,右子树大于根节点,且左子树与右子树高度差不超过1
python数据结构参考:https://blog.youkuaiyun.com/SHOUGOUGOU/article/details/107571011
大顶堆 每个节点的值大于等于左右孩子节点
小顶堆 每个节点的值小于等于左右孩子节点
优先队列
最小堆 完全二叉树,小顶堆
最大堆
哈夫曼编码 压缩编码,带权路径最小。用最小堆实现,1)每次取权值最小的两个节点,构建二叉树节点,2)把相加后的权值放入堆,3)重复第一步操作
LRU缓存 缓存算法的一种,如果数据在一段时间内使用次数很少,那么将来一段时间内被使用的可能性也很小。支持get(key)和put(key)操作。python借助Ordereddict实现,java借助LinkedHashMap实现。双向链表加哈希表可实现get、put、删除最早节点的O(1)操作。
LFU缓存 最不常使用缓存设计,平衡二叉树+哈希表。java TreeSet
DP
最长公共子序列
最长公共子串
最长子序列的和
动态规划:max(d[i-1]+num[i], num[i])
回溯算法 (通过剪枝减少时间复杂度)
八皇后,01背包,全排列
DFS 深度优先搜索,后进先出,用栈辅助,用到递归和回溯
BFS 广度优先搜索,最短路径,用队列辅助
最小生成树:连通网的生成树中,所有边的代价和最小
Prime: 加点法 ,MST性质应用,每次迭代选择代价最小的点,时间复杂度O(n*n),适合边稠密的网,U, V
Kruskal: 加边法,每次迭代选择满足条件的最小代价边。可以用并查集判断所选边的两个顶点是否属于两颗树,即是否形成环。时间复杂度O(e*loge),适合边稀疏的网
图最短路径 Dijkstra
a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则{u,v}正常有权值,若u不是v的出边邻接点,则{u,v}权值为∞。
b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
d.重复步骤b和c直到所有顶点都包含在S中。
待更新:
字典树
拓扑排序
KMP