对象和指针
这些只是基本数据结构,就像另一个答案中的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
这种方法通常用于面向对象的实现,因为它对于面向对象的用户更具可读性和便利性。
矩阵
矩阵只是一个简单的二维数组。假设您有一个顶点ID,可以将其表示为一个int数组,如下所示:
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>>
。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申请,则应该知道该网络图是稀疏的。您可以使用BigTable以更可扩展的方式处理它们。
哦,顺便说一句,这是带有精美图片的这篇帖子的很好总结;)