javascript 的 map 是存储邻接表的理想选择,因其支持 o(1) 平均查找、动态增删、插入顺序保持;推荐用 map 表示有向图,无向图需双向 set,带权图可用对象数组或嵌套 map 扩展。

在图计算算法中,JavaScript 的 Map 是存储邻接表的理想选择,因为它能高效地将节点(键)映射到其邻居集合(值),支持动态增删、O(1) 平均查找,并天然保持插入顺序(对某些遍历逻辑有帮助)。
用 Map 表示邻接表的基本结构
每个图节点作为 Map 的键(通常用字符串或数字表示 ID),对应的值是一个数组(或 Set)——存放所有直接相连的邻居节点。
- 推荐用
Map<string string></string>表示有向图:例如map.set("A", ["B", "C"])表示 A 指向 B 和 C - 无向图需双向添加:
map.set("A", ["B"]); map.set("B", ["A"]),或统一在插入边时做两次set - 若需去重或高频查存在性,值可用
Set<string></string>替代数组,如map.set("A", new Set(["B", "C"]))
适配常见图算法的操作习惯
多数图算法(如 BFS、DFS、PageRank 初始化)需要快速获取某节点的所有邻居。Map 天然支持 map.get(node) 直接取邻接列表,无需遍历整个数据结构。
- BFS 中队列扩展时:
const neighbors = graph.get(current) || [];—— 注意空值保护 - DFS 递归前检查是否存在该节点:
if (!graph.has(node)) return;,避免undefined导致运行时错误 - 添加新节点(孤立点)只需:
graph.set("D", []),不破坏已有结构
处理带权图或元信息的扩展方式
若边有权重或需附加属性(如距离、标签、时间戳),值可改为对象数组或 Map:
- 对象数组:
map.set("A", [{ to: "B", weight: 5 }, { to: "C", weight: 2 }]) - 以目标节点为键的嵌套 Map:
map.set("A", new Map([["B", 5], ["C", 2]])),支持 O(1) 查指定邻居权重 - 注意:此时
graph.get("A").size或.length仍可快速得度数,语义清晰
性能与边界提醒
Map 在 V8 引擎中对键类型敏感:用原始值(string/number)作键最高效;避免用对象或函数作键(会触发引用比较,且无法复用)。
- 初始化建议预设容量(虽 JS Map 不显式支持,但批量
set比循环set更快) - 删除节点用
map.delete(key),清空全部用map.clear(),比重建新 Map 更轻量 - 遍历时优先用
for (const [node, neighbors] of map),语义明确且避免map.keys()+map.get()二次查找
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











