-
一、图算法:解决 “连接与路径” 问题
比如地图路线规划、网络拓扑分析,先明确 “怎么遍历节点”,再解决 “怎么找最短路径 / 最小成本”。
1. 图的遍历算法(基础:先学会 “逛遍所有节点”)
-
BFS(广度优先搜索)
→ 核心逻辑:按 “层次” 逛,比如先逛完当前节点的所有邻居,再逛邻居的邻居(用队列记待逛节点)。
→ 用在哪:找无权图最短路线(如迷宫最少步数)、朋友圈人数统计、APP 消息 “逐层推送”。
-
DFS(深度优先搜索)
→ 核心逻辑:按 “深度” 逛,比如一条路走到头,没路了再回头换条路(用栈 / 递归记路线)。
→ 用在哪:找所有迷宫出口、项目任务依赖排序(拓扑排序)、检测网络中是否有 “循环依赖”。
2. 最小生成树算法(需求:连接所有节点,成本最低)
-
Prim 算法
→ 核心逻辑:从一个节点出发,每次选 “离已连区域最近的节点” 加入,像 “慢慢扩大圈子”。
→ 用在哪:稠密图(边多、节点少),比如城市内部电网铺设(少节点、多电缆,要省总长度)。
-
Kruskal 算法
→ 核心逻辑:先把所有 “边” 按成本排序,每次选 “不绕圈的边” 接上,像 “拼积木”。
→ 用在哪:稀疏图(边少、节点多),比如跨城市光纤搭建(多城市、少光纤,避免绕路浪费)。
3. 最短路径算法(需求:从 A 到 B,路线最短 / 成本最低)
-
Dijkstra 算法
→ 核心逻辑:从起点出发,每次选 “当前最短路径的节点”,更新邻居的路径长度(不支持负成本)。
→ 用在哪:导航 APP 算 “家到公司最短距离”、外卖平台算 “骑手到商家最快路线”。
-
Floyd 算法
→ 核心逻辑:算 “所有节点之间的最短路径”,比如 A 到 B、A 到 C、B 到 C,像 “一次性算完所有组合”。
→ 用在哪:物流系统算 “所有仓库到所有门店的运输成本”(小规模数据适用)。
4. 拓扑排序算法(需求:处理 “依赖关系”,比如先做 A 再做 B)
-
基于 DFS 的拓扑排序
→ 核心逻辑:逛节点时,“最后逛完的节点” 先记下来,最后倒过来就是排序结果。
→ 用在哪:代码编译顺序(先编译被依赖的文件)、课程表安排(先学高数再学线代)。
-
Kahn 算法
→ 核心逻辑:先找 “无依赖的节点”(比如不用先学任何课的通识课),处理完再找下一批,像 “逐步解锁任务”。
→ 用在哪:检测是否有循环依赖(比如 “先学 A 要先学 B,先学 B 要先学 A”)、项目任务排期。
二、查找算法:解决 “快速找数据” 问题
比如查字典、找手机联系人,核心是 “越快越好”,不同数据类型对应不同方法。
1. 简单查找(数据无序 / 少量)
-
顺序查找
→ 核心逻辑:从第一个数据开始,逐个对比,直到找到(像翻书找某一页)。
→ 用在哪:找未排序的列表(如微信聊天记录搜关键词)、数据量少(比如 10 个以内)的场景。
2. 有序查找(数据已排好序)
-
二分查找
→ 核心逻辑:把有序数据分成两半,比目标大就查左半,小就查右半,像 “猜数字游戏”。
→ 用在哪:查字典(按拼音排序)、APP 里的 “联系人按字母排序查找”(仅支持数组,不支持链表)。
-
二叉排序树(BST)查找
→ 核心逻辑:树的规则是 “左子树比根小,右子树比根大”,按目标大小找左 / 右子树。
→ 用在哪:数据要频繁增删(如实时更新的商品列表),但数据有序时会 “变丑”(比如全是左子树,找起来变慢)。
-
平衡二叉树(AVL)查找
→ 核心逻辑:在 BST 基础上 “整容”,保证左右子树高度差不多,避免 “变丑”(用旋转调整结构)。
→ 用在哪:股票行情实时查询(价格频繁变,还要快速找某支股票)、高频增删的有序数据。
3. 哈希查找(追求 “瞬间找到”)
-
哈希表查找
→ 核心逻辑:给数据编个 “专属编号”(哈希值),按编号直接定位位置,像 “快递柜按取件码找柜子”。
→ 用在哪:缓存(比如 Redis 存用户信息)、数据库索引、手机联系人按 “姓名首字母” 快速定位。
三、排序算法:解决 “数据变有序” 问题
比如成绩排名、商品按销量排序,先看 “数据规模”,再看 “是否要稳定(相等数据不换位置)”。
1. 小规模数据 / 基本有序(简单排序)
-
直接插入排序
→ 核心逻辑:像整理扑克牌,拿到一张牌,插入到前面已排好的牌里合适的位置。
→ 用在哪:班级小测验成绩排序(30 人以内)、Excel 里的 “小批量数据排序”。
-
冒泡排序
→ 核心逻辑:像气泡往上飘,每次把最大的数 “推到最后”(相邻数据对比,逆序就交换)。
→ 用在哪:教学演示(容易理解)、数据基本有序(比如大部分成绩已排好,只剩几个乱的)。
2. 中大规模数据(高效排序)
-
快速排序
→ 核心逻辑:选一个 “基准数”,把比它小的放左边,大的放右边,再分别排序左右(像 “分蛋糕”)。
→ 用在哪:电商平台 “千万级商品按销量排序”、数据库里的 “大规模数据查询排序”(最快的排序之一)。
-
堆排序
→ 核心逻辑:把数据建成 “大堆”(堆顶是最大数),每次拿最大数放最后,再调整堆(像 “选冠军”)。
→ 用在哪:找 “TopK”(比如销量前 10 的商品)、内存有限时的大规模排序(省空间)。
-
归并排序
→ 核心逻辑:把数据分成两半,分别排序,再把两个有序的半区 “合并”(像 “合并两个有序列表”)。
→ 用在哪:海量日志排序(支持外部排序,数据放硬盘)、需要 “稳定排序” 的场景(比如按成绩排序,相同成绩保留原顺序)。
3. 特殊数据(整数 / 固定长度字符串)
-
基数排序
→ 核心逻辑:按 “数字位数” 排序,先排个位,再排十位,最后排百位(像 “按学号最后一位、倒数第二位排序”)。
→ 用在哪:手机号排序、快递单号排序(固定长度的字符串 / 整数)。
四、树与二叉树算法:解决 “层级数据” 问题
比如文件系统(文件夹套文件夹)、公司组织架构,先学会 “遍历”,再学 “构建与优化”。
1. 二叉树遍历(基础:逛遍树的所有节点)
-
前序 / 中序 / 后序遍历(递归 / 非递归)
→ 核心逻辑:
-
前序:先逛根,再逛左子树,最后逛右子树(像 “先看文件夹,再看里面的文件”);
-
中序:先逛左子树,再逛根,最后逛右子树(常用于 “二叉排序树”,遍历结果是有序的);
-
后序:先逛左子树,再逛右子树,最后逛根(像 “先删文件,再删文件夹”)。
→ 用在哪:重建二叉树(比如根据遍历结果恢复文件目录)、统计树的层数(比如公司有多少级部门)。
-
-
层次遍历
→ 核心逻辑:按 “层” 逛,先逛完第一层(根),再逛第二层(根的孩子),以此类推(用队列记待逛节点)。
→ 用在哪:APP 评论区 “按楼层显示回复”、计算树的 “最宽层”(比如某层有多少个部门)。
2. 树的构建与应用(解决实际问题)
-
哈夫曼树构建
→ 核心逻辑:选两个 “权重最小的节点” 合并成新节点,重复到只剩一个节点(权重可以是 “出现次数”)。
→ 用在哪:数据压缩(比如图片、音频压缩),权重高的节点用短编码(少占空间),权重低的用长编码。
-
二叉树线索化
→ 核心逻辑:把树里 “空着的指针” 改成 “线索”,指向 “前一个节点” 或 “后一个节点”(像给树加 “导航箭头”)。
→ 用在哪:频繁遍历树的场景(比如日志系统按时间顺序遍历所有日志),不用每次遍历都用栈 / 递归(省内存)。
-
算法大类 | 算法子类 | 具体算法 | 核心逻辑(通俗解释) | 适用场景(具体举例) |
---|---|---|---|---|
图算法 | 图的遍历(基础) | BFS(广度优先搜索) | 按 “层级” 逛:先逛当前节点的所有邻居,再逛邻居的邻居;用队列记 “待逛节点” | 1. 无权图最短路径(迷宫找最短出口、地图 APP 最少转弯路线);2. 统计朋友圈人数;3. APP 消息逐层推送 |
DFS(深度优先搜索) | 按 “深度” 逛:一条路走到头,没路了再回头换条路;用栈 / 递归记 “走过的路” | 1. 找迷宫所有出口;2. 项目任务依赖排序(如先做设计再做开发);3. 检测循环依赖(如 “先学 A 要先学 B,先学 B 要先学 A”) | ||
最小生成树(省成本) | Prim(普里姆) | 从 1 个节点出发,每次加 “离已连区域最近的节点”,像 “慢慢扩大圈子” | 稠密图(边多、节点少):城市内部电网铺设(节点是变电站,边是电缆,省总长度) | |
Kruskal(克鲁斯卡尔) | 先把所有边按 “成本” 从小到大排序,每次选 “不绕圈的边” 接上,像 “拼积木” | 稀疏图(边少、节点多):跨城市光纤搭建(节点是城市,边是光纤,避免绕路浪费) | ||
最短路径(找近路) | Dijkstra(迪杰斯特拉) | 从起点出发,每次选 “当前最短路径的节点”,更新邻居的路径长度;不支持负成本 | 单源最短路径:导航 APP 算 “家到公司的最短距离”、外卖骑手到商家的最快路线 | |
Floyd(弗洛伊德) | 一次性算 “所有节点对的最短路径”,通过 “中间节点” 更新路线,像 “批量算所有组合” | 小规模数据的多源路径:物流系统算 “所有仓库到所有门店的运输成本” | ||
拓扑排序(解依赖) | 基于 DFS 的拓扑排序 | 逛节点时,“最后逛完的节点” 先记下来,最后把记录逆序,就是排序结果 | 有依赖的排序:代码编译顺序(先编译被依赖的文件)、大学课程表安排(先学高数再学线代) | |
Kahn 算法 | 先找 “无依赖的节点”(如不用先学任何课的通识课),处理完再找下一批,像 “逐步解锁任务” | 1. 同上;2. 检测图是否有环(若最终没遍历完所有节点,说明有循环依赖) | ||
查找算法 | 简单查找(无序 / 少量) | 顺序查找 | 从第一个数据开始,逐个对比目标值,直到找到或遍历结束;像 “翻书找某一页” | 无序数据 / 小规模数据:微信聊天记录搜关键词、10 个以内的员工名单找某个人 |
有序查找(已排序) | 二分查找(折半查找) | 把有序数据分成两半,比目标大就查左半,小就查右半;像 “猜数字游戏(高了往低猜,低了往高猜)” | 有序数组:字典按拼音查词、手机联系人按字母排序查找(不能用于链表) | |
二叉排序树(BST)查找 | 树的规则:左子树值<根节点<右子树;按目标值大小,找左 / 右子树 | 频繁增删的有序数据:实时更新的商品价格列表(如电商平台商品涨价 / 降价后仍能快速查找) | ||
平衡二叉树(AVL)查找 | 在 BST 基础上 “整容”:用旋转(LL/LR/RR/RL)保证左右子树高度差≤1,避免 BST “变丑”(退化成链表) | 高频增删 + 快速查找:股票行情实时查询(价格频繁变,还要快速找某支股票) | ||
哈希查找(瞬间定位) | 哈希表(散列表)查找 | 给数据编 “专属编号”(哈希值),按编号直接定位位置;用 “链地址法”“开放地址法” 处理 “编号重复” | 追求极致速度:缓存(Redis 存用户信息,按用户 ID 秒查)、数据库索引、手机联系人按 “姓名首字母” 定位 | |
排序算法 | 简单排序(小规模) | 直接插入排序 | 像整理扑克牌:拿到一张牌,插入到前面已排好的牌里合适的位置 | 小规模 / 基本有序数据:班级 30 人以内的测验成绩排序、Excel 小批量数据排序 |
冒泡排序 | 像气泡往上飘:相邻数据对比,逆序就交换,逐步把 “最大的数” 推到最后;可加标志位优化(有序则提前退出) | 教学演示、数据基本有序(如大部分成绩已排好,只剩 3-5 个乱序) | ||
高效排序(中大规模) | 快速排序 | 选 “基准数”,把比它小的放左边,大的放右边,再分别排序左右两区;像 “分蛋糕,先分再切” | 大规模无序数据:电商平台千万级商品按销量排序、数据库大规模数据查询排序 | |
堆排序 | 把数据建成 “大根堆”(堆顶是最大数),每次拿堆顶放最后,再调整堆结构;像 “选冠军,选完再选次冠军” | 1. TopK 问题(找销量前 10 的商品、成绩前 5 的学生);2. 内存有限的大规模排序(省空间) | ||
归并排序 | 分治法:把数据分成两半,分别排序,再把两个有序半区 “合并”;像 “先把两堆有序的牌合成一堆” | 1. 海量日志排序(支持外部排序,数据放硬盘);2. 需要稳定排序(如按成绩排序,相同成绩保留原顺序) | ||
特殊排序(固定格式) | 基数排序 | 按 “数字位数” 排序:先排个位,再排十位,最后排百位;像 “按学号最后一位、倒数第二位排序” | 整数 / 固定长度字符串:手机号排序、快递单号排序、身份证号排序 | |
树与二叉树算法 | 二叉树遍历(基础) | 前序 / 中序 / 后序遍历 | 递归逻辑:- 前序:根→左→右(先看文件夹,再看里面的文件)- 中序:左→根→右(BST 遍历结果有序)- 后序:左→右→根(先删文件,再删文件夹) | 1. 重建二叉树(已知前序 + 中序,恢复文件目录结构);2. 统计树的节点数、深度(如公司有多少级部门) |
层次遍历 | 按 “层” 逛:先逛完第一层(根),再逛第二层(根的孩子);用队列记 “待逛节点” | 1. 评论区按楼层显示回复;2. 计算树的 “最宽层”(某层有多少个部门 / 评论) | ||
树的构建与应用 | 哈夫曼树构建 | 每次选两个 “权重最小的节点” 合并成新节点,重复至只剩一个节点;权重可指 “数据出现次数” | 数据压缩:图片、音频文件压缩(权重高的节点用短编码,省存储空间) | |
二叉树线索化 | 把树里 “空着的指针” 改成 “线索”,指向前一个 / 后一个节点;像给树加 “导航箭头” | 频繁遍历树:日志系统按时间顺序遍历所有日志节点(不用每次遍历都用栈 / 递归,省内存) |
评论区