【发布时间】:2017-08-18 21:01:02
【问题描述】:
在我的算法课中,有人告诉我,用于图形表示的邻接列表的一个缺点是 O(n) 查找时间,用于遍历与每个节点对应的相邻节点数组。我通过使用将节点映射到其相邻节点的 HashSet 的 HashMap 来实现我的邻接列表,这不是只需要 O(1) 查找时间吗?我有什么遗漏吗?
【问题讨论】:
标签: algorithm graph hashmap big-o adjacency-list
在我的算法课中,有人告诉我,用于图形表示的邻接列表的一个缺点是 O(n) 查找时间,用于遍历与每个节点对应的相邻节点数组。我通过使用将节点映射到其相邻节点的 HashSet 的 HashMap 来实现我的邻接列表,这不是只需要 O(1) 查找时间吗?我有什么遗漏吗?
【问题讨论】:
标签: algorithm graph hashmap big-o adjacency-list
如您所知,使用 HashMap 中的键查找值是 O(1)。但是,在邻接列表中,HashMap 的值也是其相邻节点的列表。邻接表的主要目的是迭代相邻节点。例如:图遍历算法,如 DFS 和 BFS。在你的情况下HashSet。假设 HashSet 中的元素个数为 n。然后即使在 HashSet 中迭代所有元素也是 O(n)。
So, total complexity would be O(1)+O(n).
Where O(1)= look up in HashMap
O(n)= iterate all the elements
通常,邻接表更适合稀疏图,因为它是只有几条边的图。这意味着每个节点(HashMap的键)中相邻元素的数量较少。因此,查找元素不会花费更多。
【讨论】:
我通过使用将节点映射到其相邻节点的 HashSet 的 HashMap 来实现我的邻接 list,这不是只需要 O(1) 查找时间? [强调我的]
是的——但是“adjacency list”通常意味着表示为数组或链表而不是 HashSet:换句话说,邻接表被优化用于迭代顶点的邻居而不是查询是否有两个顶点邻居。
【讨论】:
可能产生比邻接表更省时的图表示,特别是对于顶点顶点通常有许多边的图。
使用顶点映射,其中每个顶点包含相邻顶点和/或边缘对象的映射,我们可以通过索引顶点 id 然后索引邻居来查看节点是否在 O(1) 时间内连接。与邻接列表相比,这可能是一个很大的节省,因为邻接列表我们可能需要遍历许多边才能找到特定的邻居。此外,map-of-maps 数据结构可以让我们将任意数据存储在边缘对象中。这对于加权图和动作/边的特征很有用
【讨论】: