Java中的标记图表示
假设我们有一个有向标记图,即从一个顶点到另一个顶点的边用一个值标记的图。我们如何用Java建模?(或者通常使用面向对象语言?) 我当前的解决方案是使用一个类Java中的标记图表示,java,oop,data-structures,graph,Java,Oop,Data Structures,Graph,假设我们有一个有向标记图,即从一个顶点到另一个顶点的边用一个值标记的图。我们如何用Java建模?(或者通常使用面向对象语言?) 我当前的解决方案是使用一个类Vertex,该类有一个集合支出项和一个集合收入边,其中边是一个具有三个字段的类: label哪个是边的标签 前身哪个是源顶点 后续哪个是目标顶点 其他解决方案?看起来还可以。这类似于在数据库中建模多对多关系的标准技术,数据库中有一个辅助表来保存有关关系的信息 是否也有根顶点的集合 根据需要进行的遍历,可能不需要传入边-例如,如果仅从根开
Vertex
,该类有一个集合支出项
和一个集合收入边
,其中边
是一个具有三个字段的类:
哪个是边的标签label
哪个是源前身
顶点
哪个是目标后续
顶点
其他解决方案?看起来还可以。这类似于在数据库中建模多对多关系的标准技术,数据库中有一个辅助表来保存有关关系的信息 是否也有根顶点的集合 根据需要进行的遍历,可能不需要传入边-例如,如果仅从根开始
严格地说,您甚至不需要顶点对象,如果没有附加任何其他信息,您可以对顶点进行编号,并将编号放在每条边的前置和后继中。不过,这可能有点过分:)我认为你所做的是对的。您可以添加一个图形类,该类的成员包括顶点列表和边列表
您已将所有实体表示为对象,因此我觉得这没问题。我不会说您需要分离出射边和入射边,您只需检查顶点是源还是目标,并使用实用方法提供出射边和入射边。我注意到很多实现代码定向图和无向图都不同,真的没有理由这样做。。。。“根顶点”是什么意思?据我回忆,只有树有根。。。还是不?我没有提到节点中包含信息,所以它们是必需的,但您在下面加了下划线,在某些情况下可以忽略它们。前导在一般数据结构中可能很有用,但你是对的,它们并不是表示我用根垂直描述的结构的严格必要条件,我指的是没有前导的顶点集合。大多数遍历的起点可能是正确的,尽管在效率方面,区分顶点可以避免重复过滤效率,并且OO语言(尤其是VM)不能很好地结合在一起。如果以原始速度为目标,您将使用邻接矩阵(或者至少用一些基本类型替换对象)。我已经写了9年的图形库了,我会诚实地说,它归结为OO抽象或原始速度,很少有理由证明任何东西在中间。