通过 AdjacencyLists 实现图
Implementing Graph by AdjacencyLists
我想使用 AdjacencyLists
实现(在 Java 中)图 class,我会在 [=11= 的最小生成树上使用这个 class ] 算法。
我读到有很多方法可以做到这一点,但我不能使用基于更简单的原始数据类型(LinkedList
、堆栈等)构建的数据结构,所以我认为也许一个好的解决方案是使用 HashTable
并将它们与 ArrayList
而不是 LinkedList
.
合并
我读到合并LinkedList
和HashTable
的目标是合并LinkedList
(顶点邻接表的最优枚举)和HashTable
(快速搜索)的优点并添加边缘)。
我想知道两件事:
- 我可以通过使用 ArrayList 而不是 LinkedList 来保持这些特性吗?
使用 HashTable 链接到另一个 HashTable 会更好吗?
还有其他建议吗?如果我使用 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
我想使用 AdjacencyLists
实现(在 Java 中)图 class,我会在 [=11= 的最小生成树上使用这个 class ] 算法。
我读到有很多方法可以做到这一点,但我不能使用基于更简单的原始数据类型(LinkedList
、堆栈等)构建的数据结构,所以我认为也许一个好的解决方案是使用 HashTable
并将它们与 ArrayList
而不是 LinkedList
.
我读到合并LinkedList
和HashTable
的目标是合并LinkedList
(顶点邻接表的最优枚举)和HashTable
(快速搜索)的优点并添加边缘)。
我想知道两件事:
- 我可以通过使用 ArrayList 而不是 LinkedList 来保持这些特性吗?
使用 HashTable 链接到另一个 HashTable 会更好吗?
还有其他建议吗?如果我使用
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