对象和指针
就像Hammar在其他答案中所说,它们只是基本数据结构,在Java
中,你可以使用类来表示边缘和顶点。例如,一条边连接两个顶点,可以是有向或无向的,并且可以包含权重。一个顶点可以有ID、名称等属性。通常,它们都有额外的属性。因此,您可以使用它们构建您的图形,比如
Vertex a = new Vertex(1);
Vertex b = new Vertex(2);
Edge edge = new Edge(a,b, 30); // init an edge between ab and be with weight 30
由于更加可读和方便面向对象的用户使用,这种方法通常用于面向对象的实现 ;).
矩阵
矩阵只是一个简单的二维数组。假设您有可以表示为int数组的顶点ID:
int[][] adjacencyMatrix = new int[SIZE][SIZE]; // SIZE is the number of vertices in our graph
adjacencyMatrix[0][1] = 30; // sets the weight of a vertex 0 that is adjacent to vertex 1
这通常用于需要索引访问的密集图。您可以使用此结构表示有向或无向加权结构。
邻接表
这只是一个简单的数据结构混合,我通常使用HashMap<Vertex, List<Vertex>>
来实现。类似的工具可以使用Guava中的HashMultimap
。
这种方法很酷,因为您可以通过O(1)(平摊)时间复杂度进行顶点查找,并返回与该特定顶点相邻的所有顶点列表。
ArrayList<Vertex> list = new ArrayList<>();
list.add(new Vertex(2));
list.add(new Vertex(3));
map.put(new Vertex(1), list); // vertex 1 is adjacent to 2 and 3
这个用于表示稀疏图,如果您正在申请Google公司,那么您应该知道WebGraph是稀疏的。您可以使用BigTable以更可扩展的方式处理它们。
另外顺便提一下,这里有一个非常好的摘要,带有漂亮的图片 ;)