【发布时间】:2013-08-21 22:04:02
【问题描述】:
我正在准备面试和审查图表实现。我经常看到的是邻接表和邻接矩阵。当我们考虑基本操作的运行时,为什么我从来没有看到使用散列的数据结构?
例如,在 Java 中,邻接列表通常是 ArrayList<LinkedList<Node>>,但为什么人们不使用 HashMap<Node, HashSet<Node>>?
设 n = 节点数,m = 边数。
在这两种实现中,删除节点 v 涉及搜索所有集合并删除 v。在邻接列表中,这是 O(n^2),但在“邻接集”中,是 O(n)。同样,删除一条边包括从 v 的列表中删除节点 u 和从 u 的列表中删除节点 v。在邻接列表中,这是 O(n),而在邻接集中,是 O(1)。其他操作,例如查找节点后继,查找两个节点之间是否存在路径等,对于这两种实现都是相同的。空间复杂度也是 O(n + m)。
我能想到的邻接集的唯一缺点是添加节点/边的摊销是 O(1),而在邻接列表中这样做确实是 O(1)。
也许我没有看到任何东西,或者我在计算运行时间时忘记考虑一些事情,所以请告诉我。
【问题讨论】:
-
我的第一个想法是迭代(遍历)可能会更慢。计算机喜欢序列。
标签: algorithm graph runtime adjacency-list