【问题标题】:Adjacency list with O(1) look up time using HashSet?使用 HashSet 查找时间为 O(1) 的邻接表?
【发布时间】:2017-08-18 21:01:02
【问题描述】:

在我的算法课中,有人告诉我,用于图形表示的邻接列表的一个缺点是 O(n) 查找时间,用于遍历与每个节点对应的相邻节点数组。我通过使用将节点映射到其相邻节点的 HashSet 的 HashMap 来实现我的邻接列表,这不是只需要 O(1) 查找时间吗?我有什么遗漏吗?

【问题讨论】:

    标签: algorithm graph hashmap big-o adjacency-list


    【解决方案1】:

    如您所知,使用 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 的意思。我的意思是我使用 HashSet 数据结构(基本上是一组具有 O(1) 查找时间的元素)作为我的键的值。如果我是正确的,您认为我的值是我命名为 HashSet 的通用列表。
    • 嗯,不。我的意思是,邻接列表的主要目的是存储邻接节点,并且只要这些节点需要像 DFS 这样的算法,它们就会使用并遍历所有节点。因此,如果您使用 HashSet 时间复杂度也是 O(n) 进行迭代。是的,查找 HashSet 是 O(1)。你是对的。请参阅我的更新答案。我想现在很清楚了。
    【解决方案2】:

    我通过使用将节点映射到其相邻节点的 HashSet 的 HashMap 来实现我的邻接 list,这不是只需要 O(1) 查找时间? [强调我的]

    是的——但是“adjacency list”通常意味着表示为数组或链表而不是 HashSet:换句话说,邻接表被优化用于迭代顶点的邻居而不是查询是否有两个顶点邻居。

    【讨论】:

      【解决方案3】:

      可能产生比邻接表更省时的图表示,特别是对于顶点顶点通常有许多边的图。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 2018-07-14
        • 1970-01-01
        • 2011-08-09
        • 1970-01-01
        • 2013-03-06
        • 1970-01-01
        相关资源
        最近更新 更多