适用于图形的ADT

时间:2009-11-04 22:45:19

标签: algorithm graph

图表有哪些合适的数据结构?

我想答案因图表的类型而异?

无论如何,有什么建议吗?

3 个答案:

答案 0 :(得分:2)

用于存储图表的两种最常见的结构是adjacency listsadjacency matrices。使用哪种方法通常取决于您计划对图表执行的操作(因为可以为给定算法提供比另一个更优化的操作/访问时间),以及图表的稀疏度或密度(列表是对于稀疏图来说,矩阵更紧凑,图表的密度越大,相对开销就越小。

答案 1 :(得分:1)

当图表稀疏时,Map<Vertex, List<Vertex>>(1)会这样做。如果它很密集,也可以使用2D数组(2)。

请参阅:

(1)http://en.wikipedia.org/wiki/Adjacency_list

(2)http://en.wikipedia.org/wiki/Adjacency_matrix

答案 2 :(得分:1)

看到你想要一个抽象数据类型,我不会提及有关实现的任何内容。

图表G = <V, E>是一组顶点V和一组边EE中的每个元素都是元组e = <v1, v2>v1v2位于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. */

将其扩展为有向图是一项练习:-)