我正在做面试准备和审查图表实现。我经常看到的是邻接表和邻接矩阵。当我们考虑基本操作的运行时,为什么我从来没有看到使用散列的数据结构?
例如,在 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)。
也许我没有看到任何东西,或者我在计算运行时间时忘记考虑一些事情,所以请告诉我。