图表有哪些合适的数据结构?
我想答案因图表的类型而异?
无论如何,有什么建议吗?
答案 0 :(得分:2)
用于存储图表的两种最常见的结构是adjacency lists和adjacency matrices。使用哪种方法通常取决于您计划对图表执行的操作(因为可以为给定算法提供比另一个更优化的操作/访问时间),以及图表的稀疏度或密度(列表是对于稀疏图来说,矩阵更紧凑,图表的密度越大,相对开销就越小。
答案 1 :(得分:1)
当图表稀疏时,Map<Vertex, List<Vertex>>
(1)会这样做。如果它很密集,也可以使用2D数组(2)。
请参阅:
答案 2 :(得分:1)
看到你想要一个抽象数据类型,我不会提及有关实现的任何内容。
图表G = <V, E>
是一组顶点V
和一组边E
,E
中的每个元素都是元组e = <v1, v2>
, v1
和v2
位于V
。
以下可能看起来像Java,但我真的想到任何充分表达的语言:
interface Graph {
Set getVertices();
Set getEdges();
void addVertex(Object v);
void addEdge(Object v1, Object v2);
void removeVrtex(Object v);
void removeEdge(Object v1, Object v2);
}
我认为这是最低限度的。我没有指定getEdges
返回的内容;如果语言具有本机元组类型,那么它将是一组。在实践中,您可能希望添加额外的方法,例如:
int getDegree(Object v);
void contractEdge(Object v1, Object v2);
boolean isIsthmus(Object v1, Object v2); /* does removal of this edge increase the number of components? */
int numComponents();
boolean isConnected(); /* return numComponents() <= 1 */
boolean isCycle(Set path); /* path is a set of edges. */
等
将其扩展为有向图是一项练习:-)
。