【问题标题】:Implementing Graph by AdjacencyLists通过 AdjacencyLists 实现图
【发布时间】:2018-05-24 09:27:41
【问题描述】:

我想(在 Java 中)使用 AdjacencyLists 实现一个 Graph 类,我会在最小生成树上使用这个类来实现 Prim's 算法。

我读到有很多方法可以做到这一点,但我不能使用基于更简单的原始数据类型(LinkedList、堆栈等)构建的数据结构,所以我认为使用HashTable 可能是一个很好的解决方案并将它们与ArrayList 合并,而不是LinkedList

我读到将LinkedListHashTable 合并的目标是合并LinkedList(顶点邻接列表的最佳枚举)和HashTable(快速搜索和添加边)的优点。

我想知道两件事:

  • 我是否可以通过使用 ArrayList 而不是 LinkedList 来保留这些属性?
  • 使用链接到另一个 HashTable 的 HashTable 会更好吗?

    还有什么建议吗?如果我使用HashTable,解决冲突的最佳方法是什么?我在考虑分离链。

【问题讨论】:

  • 你指的是特定的语言和框架吗?
  • 我将在 Java 中执行此操作。 @Codor

标签: algorithm data-structures graph hashtable prims-algorithm


【解决方案1】:

我假设您想要的 Graph 结构将是一个 HashTable<Vertex,ArrayList<Pair<Vertex,Float>>> 将每个顶点映射到其相邻顶点以及边权重。

您可以使用 ArrayList,因为您不需要从邻接列表中删除已处理的边。

一般来说,由于内存使用,我不建议将 HashTable 链接到第二个,因为该算法会处理顶点的所有相邻边。只有当您想要移除处理过的边缘时,它才会帮助您移除另一个方向的边缘。

请注意,虽然 HashMap + ArrayList 方法对于该算法to run in O(V^2) 来说空间有效且足够,但在需要进行许多边查找时不建议将其用于密集图。检查从 A 到 B 的边是否存在与 A 或 B 的相邻顶点数成线性关系。如果要在 O(1) 中检索它们,则需要第二个 HashTable 来存储边。 JGraphT Library中给出了一个例子。

另请注意,通常建议使用to use HashMap over HashTable

【讨论】:

  • 好的,所以 HashMap + LinkedList 将是解决此问题的最佳解决方案,但 HashMap + ArrayList 也可以。我必须注意去除边缘,但其他基本操作不会有任何问题 - 对吧?
  • 除非您想在 ArrayList 的末尾而不是在特定位置添加 Edge,否则是的。虽然在“现实生活”中您无需担心,但添加元素的时间复杂度有所不同:对于 LinkedLists,它确实是 O(1);对于 ArrayLists,它只是 amortized 常数时间,因为数组 needs to be resized.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2011-10-05
  • 2017-03-14
相关资源
最近更新 更多