比较对象图表示到邻接表和matrix表示
我目前正在遵循Steve Yegge关于准备技术性编程访谈的build议: http : //steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html
他在图表部分说:
在内存中有三种基本的方式表示graphics(对象和指针,matrix和邻接表),并且你应该熟悉每个表示及其优缺点。
在CLRS中描述了matrix和邻接表的表示forms的优缺点,但是我还没有find将这些表示与对象表示进行比较的资源。
只要考虑一下,我自己可以推断出一些,但是我想确保我没有遗漏一些重要的东西。 如果有人能够全面地描述这一点,或者指出我这样做的资源,我将不胜感激。
对象和指针
这些只是一些基本的数据结构,就像Hammar在其他答案中所说的那样,在Java
你可以用类如边和顶点来表示它。 例如,一个边连接两个顶点,可以是直接的或无向的,也可以包含一个权重。 一个顶点可以有一个ID,名字等。他们大多都有其他的属性。 所以你可以像他们一样构build你的图
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
这种方法通常用于面向对象的实现,因为它对于面向对象的用户来说更具可读性和方便性。
matrix
matrix只是一个简单的二维数组。 假设你有顶点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>>
。 类似的用法可以是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
这是用来表示稀疏图,如果你正在谷歌应用,你应该知道这个webgraph是稀疏的。 您可以使用BigTable以更具扩展性的方式处理它们。
哦,顺便说一句, 这是一个很好的总结这个职位花哨的图片;)
对象和指针大部分与邻接列表相同,至less为了比较使用这些表示的algorithm的目的。
比较
struct Node { Node *neighbours[]; };
同
struct Node { Node *left; Node *right; };
在后一种情况下,您可以轻松地构build邻居列表,如果比命名指针更容易使用。
对象表示( 入侵列表 )的优点是两个相邻的顶点共享边的相同实例。 这使得使用无向边缘数据(长度,成本,stream向甚至方向)很容易操作。 但是它使用额外的内存指针。