Algorithm 使用哈希集查找时间为O(1)的邻接列表?

Algorithm 使用哈希集查找时间为O(1)的邻接列表?,algorithm,graph,hashmap,big-o,adjacency-list,Algorithm,Graph,Hashmap,Big O,Adjacency List,在我的算法课上,我被告知图表示的邻接列表的缩进是迭代每个节点对应的相邻节点数组的O(n)查找时间。我使用一个HashMap来实现我的邻接列表,该HashMap将节点映射到其相邻节点的HashSet,这不是只需要O(1)个查找时间吗?有什么我遗漏的吗?正如您所知,使用HashMap中的键查找值是O(1)。然而,在邻接列表中,HashMap的值也是其相邻节点的列表。邻接列表的主要目的是迭代相邻节点。例如:像DFS和BFS这样的图遍历算法。在你的例子中,HashSet。假设HashSet中的元素数为n

在我的算法课上,我被告知图表示的邻接列表的缩进是迭代每个节点对应的相邻节点数组的O(n)查找时间。我使用一个HashMap来实现我的邻接列表,该HashMap将节点映射到其相邻节点的HashSet,这不是只需要O(1)个查找时间吗?有什么我遗漏的吗?

正如您所知,使用HashMap中的键查找值是O(1)。然而,在邻接列表中,HashMap的值也是其相邻节点的列表。邻接列表的主要目的是迭代相邻节点。例如:像DFS和BFS这样的图遍历算法。在你的例子中,HashSet。假设HashSet中的元素数为n。然后迭代所有元素,即使在HashSet中也是O(n)

通常,对于稀疏图来说,邻接列表更可取,因为它是只有几条边的图。这意味着每个节点(HashMap的键)中相邻元素的数量更少。因此,查找元素的成本不会更高

我通过使用一个HashMap来实现我的邻接列表,该HashMap将节点映射到其相邻节点的Hash,这难道不需要O(1)个查找时间吗?[我的重点]


右-但“”通常表示为数组或链表,而不是哈希集:换句话说,邻接列表优化用于迭代顶点的邻居,而不是查询两个顶点是否为邻居。

可能生成比邻接列表更具时间效率的图形表示,特别是对于顶点通常有许多边的图


对于每个顶点都包含相邻顶点和/或边对象的顶点映射,我们可以通过索引顶点id然后索引邻居来查看节点是否在O(1)时间内连接。与邻接列表相比,这可能是一个巨大的节约,因为在邻接列表中,我们可能需要循环许多边来找到特定的邻居。此外,map of maps数据结构允许我们在边缘对象中存储任意数据。这对于加权图和动作/边的特征很有用

我不确定我是否清楚我所说的HashSet是什么意思。我的意思是我使用一个HashSet数据结构(基本上是一组具有O(1)查找时间的元素)作为键的值。如果我是对的,你认为我的值是一个我命名为HashSet的通用列表。不。我的意思是邻接列表的主要目的是存储邻接节点,并且每当这些节点需要用于像DFS这样的算法时,它们就会使用并遍历所有节点。所以,如果使用HashSet,迭代的时间复杂度也是O(n)。是的,查找HashSet是O(1)。你说得对。请参阅我的最新答案。我想现在已经很清楚了。
So, total complexity would be O(1)+O(n).

    Where O(1)= look up in HashMap
          O(n)= iterate all the elements