通过 AdjacencyLists 实现图

Implementing Graph by AdjacencyLists

我想使用 AdjacencyLists 实现(在 Java 中)图 class,我会在 [=11= 的最小生成树上使用这个 class ] 算法。

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

合并

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

我想知道两件事:

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

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

一般来说,由于内存使用问题,我不建议将 HashTable 链接到第二个 HashTable,因为该算法会处理顶点的所有相邻边。只有当你想去掉一个加工过的边时,它才会帮你去掉另一个方向的边。

请注意,虽然 HashMap + ArrayList 方法 space 高效且足以满足此算法 to run in O(V^2), it is not recommended for dense graphs when many edge lookups are required. Checking whether an edge from A to B exists is linear in the number of adjacent vertices of A or B. If you want to retrieve them in O(1), you would want a second HashTable to store the edges. An example is given in the JGraphT Library

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