邻接信息应该存储在图形对象中还是存储在顶点本身中?

时间:2014-03-14 18:50:29

标签: java algorithm graph adjacency-list

为了演示邻接列表的概念,我假设很容易将列表表示为列表并将顶点作为数字放在一个数组中,我们可以直接通过索引引用它们在图表中。一旦我们得到顶点的索引,我们就可以得到相应的列表数组。

但是,对于实际对象,顶点不能仅由数组索引引用,我会假设需要创建一个单独的顶点对象。在这种情况下,我的问题是边缘信息应该在何处实现。

在基于OO的编程语言中,例如java,我看到了基于邻接列表的图形实现的实现,其中邻接信息存储在顶点对象本身中,并且具有某种类型的数据结构的数据成员,例如数组,但是,我也看到人们通过维护边缘列表来实现图形对象本身的邻接边缘信息。

是否应该存储边缘信息的个人偏好?

1 个答案:

答案 0 :(得分:0)

我认为这取决于您希望图API看起来如何。

假设例如图表使用表示顶点的任意泛型类型。在这种情况下,您可以简单地将邻接数据结构作为图类的成员来代替定义顶级包装以供内部使用(并在其中管理邻接):

public class Graph<V> {
  private Map<V, Set<V>> adjacencies;
  ..
}  

另一方面,如果您希望将Vertex对象与其邻接关系一起公开(我找不到合理的原因),那么您应该注意数据的一致性。必须仅为调用者(或防御性复制)读取邻接数据,否则调用者可能会改变边缘,使其不再对称。

总而言之,图表类维护的邻接数据对我来说似乎是一个更好的选择。它简化了API和实现,如果您决定公开顶点对象,它不需要特殊的措施来保护类不变量。