Dijkstra(戴克斯特拉)& Kruskal(克鲁斯卡尔)核心特点 + 核心区别
用超市管理场景类比,纯干货无废话,记牢 3 个核心点就能分清,今天直接吃透!
一、先明确:俩算法解决的问题完全不同(基础必记)
- Dijkstra(戴克斯特拉) :解决单源最短路径 → 比如从超市入口(起点 A)到各个货架 / 收银台(其他节点),找每条路的最短距离,关注「点到点的最短路径」。
- Kruskal(克鲁斯卡尔) :解决最小生成树 → 比如给超市所有货架(节点)装连接的传送带(边),要求传送带总长度最短,且所有货架都连通、不绕圈(无环),关注「全连通的最小总代价」。
二、各自核心特点(按考试考点提炼,记死!)
📌 Dijkstra(戴克斯特拉)算法
- 核心策略 :贪心,每次选「当前离起点最近的未访问节点」,以它为跳板更新其他节点到起点的距离,逐步扩散到所有节点。
- 适用场景 :边的权值必须非负(比如距离、费用不能是负数,超市里不可能有 "负距离" 的路);有向 / 无向图都能用,主打「单源(一个起点)」最短路径。
- 关键操作 :维护一个距离数组(记录每个节点到起点的当前最短距离),不断更新、选最小节点,直到所有节点都访问完。
- 超市例子:从入口 A 到果蔬区 E,先找离 A 最近的零食区 C(1 米),再从 C 更新区到 E 的距离;再找次近的饮料区 D(2 米),再从 D 更新,最终找到 A 到 E 的最短路。
📌 Kruskal(克鲁斯卡尔)算法
- 核心策略 :贪心,每次选「权值最小的边」,如果这条边连的两个节点没连通(不形成环),就选它,直到所有节点都连通。
- 适用场景 :无向图(传送带双向连,不存在单向边);边的权值可正可负,主打「无向图的最小生成树」,不关心起点,只关心全连通的最小总代价。
- 关键操作 :把所有边按权值从小到大排序 ,用并查集(快速判断两个节点是否连通,避免环),依次选边、合并节点,直到选够「节点数 - 1」条边(n 个节点的生成树必是 n-1 条边)。
- 超市例子:给 8 个货架装传送带,先选 1 米的 A-C 传送带,再选 2 米的 D-F 传送带,再选 3 米的 B-E 传送带... 只要不绕圈就选,直到 8 个货架都连起来,总长度最短。
三、最核心区别(一张表搞定,考试不会混)
| 对比项 | Dijkstra(戴克斯特拉) | Kruskal(克鲁斯卡尔) |
|---|---|---|
| 解决问题 | 单源最短路径(一个起点→所有点) | 无向图最小生成树(全连通最小代价) |
| 贪心对象 | 选节点(当前离起点最近的) | 选边(当前权值最小的) |
| 核心工具 | 距离数组 + 选最小节点 | 边排序 + 并查集(避环) |
| 边权要求 | 必须非负 | 无要求(正 / 负都可) |
| 图的类型 | 有向 / 无向图都可 | 仅无向图 |
| 核心目标 | 找「点到点的最短距离」 | 找「全连通的最小总权值」 |
四、一句话速记(刻脑子里)
- 戴克斯选点找最短,边权不能负,有向无向都能搞;
- 克鲁斯选边连全图,只认无向图,并查集来防绕圈
阿雪技术观
在科技发展浪潮中,我们不妨积极投身技术共享。不满足于做受益者,更要主动担当贡献者。无论是分享代码、撰写技术博客,还是参与开源项目维护改进,每一个微小举动都可能蕴含推动技术进步的巨大能量。东方仙盟是汇聚力量的天地,我们携手在此探索硅基生命,为科技进步添砖加瓦。
Hey folks, in this wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Don't just be the one reaping all the benefits; step up and be a contributor too. Whether you're tossing out your code snippets, hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome place where we all come together. We're gonna team up