V

算法可视化

ZHEN
分享到微博分享到 XGitHub 仓库个人主页
学习工具算法复杂度速查算法学习路径
数据结构数组链表栈队列树堆哈希表图字典树并查集LRU 缓存跳表线段树B+ 树布隆过滤器树状数组
经典排序算法冒泡排序鸡尾酒排序双调排序选择排序插入排序二分插入排序希尔排序归并排序自顶向下归并快速排序三路快排双轴快排堆排序计数排序基数排序桶排序
图算法Dijkstra 最短路Kruskal 最小生成树Prim 最小生成树Bellman-Ford 最短路拓扑排序Floyd 多源最短路强连通分量2-SAT最大流二分图匹配LCA 倍增欧拉路径
动态规划编辑距离0-1 背包完全背包最长公共子序列最长递增子序列硬币找零方案数石子合并旅行商 TSP树形 DP数位 DP换根 DP
回溯与搜索N 皇后子集生成全排列组合总和迷宫寻路岛屿数量单词搜索数独A* 寻路
字符串KMP 字符串匹配Rabin-KarpBoyer-MooreManacher后缀数组LCP / height 数组AC 自动机Z 函数
数学与数论埃氏筛线性筛欧几里得算法快速幂扩展欧几里得中国剩余定理欧拉函数米勒-拉宾FFTPollard's Rho
计算几何凸包旋转卡壳最近点对线段相交扫描线求交
查找二分查找二分边界旋转数组搜索二分答案三分查找

复杂度速查表

全站 92 个算法的时间/空间复杂度一页看完 · 点名称直达动画页

92 个算法

数据结构

算法时间空间备注
数组O(1)O(n)随机访问 O(1);中部插删 O(n)
链表O(n)O(n)定位 O(n);已定位处插删 O(1)
栈O(1)O(n)压栈/弹栈均摊 O(1)
队列O(1)O(n)入队/出队 O(1)
树O(log n)O(n)BST 平均查改 O(log n),退化 O(n)
堆O(log n)O(n)插入/弹顶 O(log n),取顶 O(1)
哈希表期望 O(1)O(n)冲突最坏 O(n)
图O(V+E)O(V+E)邻接表遍历(BFS/DFS)
字典树O(L)O(ΣL·Σ)L=词长;空间随字符集放大
并查集摊还 O(α(n))O(n)路径压缩 + 按秩合并,近似常数
LRU 缓存O(1)O(cap)哈希 + 双向链表
跳表期望 O(log n)O(n)多层索引,概率平衡
线段树O(log n)O(n)区间查改;建树 O(n)
B+ 树O(log n)O(n)高扇出、层数低——磁盘友好
布隆过滤器O(k)O(m)k 个哈希;有误报无漏报
树状数组O(log n)O(n)前缀和查改双 log

经典排序算法

算法时间空间备注
冒泡排序O(n²)O(1)有序提前退出最好 O(n)
鸡尾酒排序O(n²)O(1)双向冒泡,乌龟提速
双调排序O(n log²n)O(1)排序网络,深度 O(log²n) 可并行
选择排序O(n²)O(1)交换次数最少 O(n)
插入排序O(n²)O(1)近乎有序时接近 O(n)
二分插入排序O(n²)O(1)比较 O(n log n),移动仍 O(n²)
希尔排序O(n^1.3)O(1)取决于步长序列
归并排序O(n log n)O(n)稳定;自底向上迭代版
自顶向下归并O(n log n)O(n)稳定;递归分治版
快速排序平均 O(n log n)O(log n)最坏 O(n²);原地
三路快排平均 O(n log n)O(log n)大量重复键退化为 O(n)
双轴快排平均 O(n log n)O(log n)JDK Arrays.sort 同款
堆排序O(n log n)O(1)原地不稳定;建堆 O(n)
计数排序O(n+k)O(k)k=值域;非比较
基数排序O(d·(n+k))O(n+k)d=位数;逐位计数排序
桶排序平均 O(n)O(n)均匀分布假设;桶内插排

图算法

算法时间空间备注
Dijkstra 最短路O((V+E) log V)O(V)堆优化;非负权
Kruskal 最小生成树O(E log E)O(V)排序 + 并查集
Prim 最小生成树O((V+E) log V)O(V)堆优化;稠密图可 O(V²)
Bellman-Ford 最短路O(V·E)O(V)容负权;可检负环
拓扑排序O(V+E)O(V)Kahn 入度队列
Floyd 多源最短路O(V³)O(V²)全源最短路
强连通分量O(V+E)O(V)Tarjan 一趟 DFS
2-SATO(V+E)O(V+E)蕴含图 + SCC
最大流O(V·E²)O(V+E)Edmonds-Karp(BFS 增广)
二分图匹配O(V·E)O(V)二分图最大匹配
LCA 倍增O(log n)O(n log n)倍增:建表 O(n log n)/查询 O(log n)
欧拉路径O(E)O(E)Hierholzer 栈法

动态规划

算法时间空间备注
编辑距离O(n·m)O(n·m)可滚动数组降 O(min(n,m))
0-1 背包O(n·W)O(n·W)可滚动至 O(W);伪多项式
完全背包O(n·W)O(W)同行来源即可重复取
最长公共子序列O(n·m)O(n·m)回溯恢复解需全表
最长递增子序列O(n²)O(n)贪心+二分可 O(n log n)
硬币找零方案数O(n·A)O(A)方案数计数 DP
石子合并O(n³)O(n²)区间 DP;四边形不等式可 O(n²)
旅行商 TSPO(2ⁿ·n²)O(2ⁿ·n)状压;n≈20 上限
树形 DPO(n)O(n)后序一趟
数位 DPO(d·10)O(d)d=位数;含 tight 状态
换根 DPO(n)O(n)二次扫描(后序+前序)

回溯与搜索

算法时间空间备注
N 皇后O(n!)O(n)剪枝后远小于 n!
子集生成O(2ⁿ·n)O(n)枚举全部子集
全排列O(n!·n)O(n)枚举全排列
组合总和O(2ⁿ)O(n)和剪枝显著加速
迷宫寻路O(m·n)O(m·n)DFS 回溯找一条路
岛屿数量O(m·n)O(m·n)Flood Fill 数连通块
单词搜索O(m·n·4^L)O(L)L=词长;失配回溯
数独O(9^k)O(k)k=空格数;约束剪枝
A* 寻路O(E log V)O(V)可采纳启发式下最优

字符串

算法时间空间备注
KMP 字符串匹配O(n+m)O(m)文本指针不回退
Rabin-Karp期望 O(n+m)O(1)滚动哈希;碰撞需验证
Boyer-Moore平均 O(n/m)O(Σ)亚线性;最坏 O(n·m)
ManacherO(n)O(n)最右回文带复用镜像
后缀数组O(n log²n)O(n)倍增法;DC3 可 O(n)
LCP / height 数组O(n)O(n)Kasai 递推
AC 自动机O(n+m+z)O(m·Σ)z=命中数;多模式
Z 函数O(n)O(n)Z-box 抄镜像

数学与数论

算法时间空间备注
埃氏筛O(N log log N)O(N)划倍数
线性筛O(N)O(N)每合数只被最小质因子划一次
欧几里得算法O(log min(a,b))O(1)辗转相除
快速幂O(log n)O(1)二进制取幂
扩展欧几里得O(log min(a,b))O(log n)回代求 Bézout 系数
中国剩余定理O(k log M)O(k)k 条同余;M=模数积
欧拉函数O(√n)O(1)按质因子打折;筛法可批量 O(N)
米勒-拉宾O(k log³n)O(1)k 轮;单轮误报 ≤1/4
FFTO(n log n)O(n)蝶形网络;多项式乘法
Pollard's Rho期望 O(n^¼)O(1)生日悖论 + gcd 显影

计算几何

算法时间空间备注
凸包O(n log n)O(n)Andrew 单调链(排序主导)
旋转卡壳O(n)O(1)凸包直径(对踵点)
最近点对O(n log n)O(n)分治 + δ 带
线段相交O(1)O(1)跨立试验(单对判定)
扫描线求交O((n+k) log n)O(n)k=交点数;扫描线

查找

算法时间空间备注
二分查找O(log n)O(1)前提有序
二分边界O(log n)O(1)lower/upper bound 半开区间
旋转数组搜索O(log n)O(1)重复元素退化 O(n)
二分答案O(log R · C)O(1)R=答案域;C=单次验证
三分查找O(log n)O(1)单峰函数求极值