用 map 存储距离和前驱比普通对象更安全灵活:支持任意类型键、保持插入顺序、避免原型污染;dist map 以节点为键存最短距离,prev map 以节点为键存前驱节点,配合最小堆实现 dijkstra 算法。

在图论最短路径算法(如 Dijkstra 或 BFS)中,用 JavaScript 的 Map 存储距离和前驱信息,比用普通对象更安全、更灵活——它支持任意类型键(比如对象节点、Symbol、甚至函数),且保持插入顺序,还避免原型污染风险。
用 Map 存距离:key 是节点,value 是当前已知最短距离
每个节点(可以是对象、字符串、数字等)作为 key,对应它到起点的最短距离(初始为 Infinity,起点为 0)。推荐初始化时统一设置:
- 创建空
Map:const dist = new Map(); - 设起点距离:
dist.set(startNode, 0); - 其余节点可在遍历时首次访问时用
dist.get(node) ?? Infinity安全读取,或提前用graph.nodes.forEach(n => dist.set(n, Infinity))初始化
用 Map 存前驱:key 是节点,value 是它的上一个节点(用于路径回溯)
前驱映射用于最终重构最短路径。同样以节点为 key,值为前一个节点(可以是引用、ID 或 null):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 初始化:
const prev = new Map(); - 起点无前驱:
prev.set(startNode, null); - 松弛成功时更新:
prev.set(neighbor, current); - 回溯路径时,从终点不断查
prev.get(node),直到得到null,再反转数组即可
配合优先队列(最小堆)使用时的注意事项
JavaScript 没有原生最小堆,常借助数组 + sort 或第三方库(如 @datastructures-js/heap)。此时需注意:
- 堆中元素建议包含节点和当前距离(如
{ node, dist }),避免只存节点后反复查dist.get(node)导致性能下降 - 若实现自定义堆,可将
distMap 作为闭包变量,使比较函数直接读取最新距离 - 不支持“减小键值”操作时(即无法更新堆中已有节点的距离),可接受重复入堆(惰性删除):出堆时检查
dist.get(node) !== currentDist就跳过
实际例子:Dijkstra 中的一次松弛操作片段
假设图用邻接表表示,graph.get(node) 返回 [{ to: neighbor, weight }]:
const dist = new Map();
const prev = new Map();
dist.set(start, 0);
prev.set(start, null);
<p>const pq = new MinHeap((a, b) => a.dist - b.dist);
pq.insert({ node: start, dist: 0 });</p><p>while (!pq.isEmpty()) {
const { node: u, dist: uDist } = pq.extract();</p><p>// 惰性删除:已找到更短路径,跳过
if (uDist > (dist.get(u) ?? Infinity)) continue;</p><p>for (const { to: v, weight } of graph.get(u) || []) {
const alt = uDist + weight;
if (alt </p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










