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
计算几何凸包旋转卡壳最近点对线段相交扫描线求交
查找二分查找二分边界旋转数组搜索二分答案三分查找

图 Graph

数据结构 · 顶点和边的任意连接(最一般的结构)

什么是图

树是「一个父亲、向下分叉」的特例;图则彻底放开——任意几个顶点之间,想连就连一条边,可以成环、可以多对多。地图路网、社交关系、网页链接,本质都是图。

图怎么遍历(不重不漏地走遍所有顶点)?两条经典路线,正好把前面学的队列和栈用上了——选个起点,点 BFS 或 DFS 看它们怎么走(点顶点可换起点)。

亲手试试
ABCDEF
 
点 BFS 或 DFS 开始

点一个顶点设为起点,再点 BFS 或 DFS。当前起点:A。

看出区别了吗——BFS(广度优先)像水波:用一个队列,先把起点的邻居全排队,再一圈圈向外,一层层访问;DFS(深度优先)像走迷宫:用一个栈(或递归),一条道走到底,撞墙了再回头换路。BFS 能找最短路(边数最少),DFS 适合探路 / 找连通块。

图怎么存 · 在哪里用

图常用两种存法:邻接表(每个顶点挂一串邻居,省空间、适合稀疏图)和邻接矩阵(一张 N×N 表,matrix[i][j]=1 表示 i、j 相连,查两点是否相邻 O(1))。

路网 / 导航:顶点是地点、边是路,最短路就是 BFS / Dijkstra。
社交网络:顶点是人、边是关注,找共同好友、做推荐。
依赖 / 调度:任务依赖图,拓扑排序定执行顺序。

到这里,从线性的栈、队列、数组、链表,到非线性的树、堆、哈希表、图——数据结构这一程就走完了。它们其实是同一件事的不同取舍:怎么把数据组织好,让该快的操作快起来。