1

在开始之前,我不太擅长图论。然而,

引自维基百科

任何没有简单环的连通图都是一棵树。森林是树木的不相交的联合体。

在浏览 JUNG 库的源代码时,我注意到森林的定义为

public interface Forest<V,E> extends DirectedGraph<V,E>

在纯语义层面上说,这不是不正确的吗?

或者

这样做有什么具体原因吗?(就像在某些算法实现中更有意义/更容易理解)

PS:我知道这DirectedGraph只是一个标记接口,并没有声明任何功能。因此,使用DirectedGraph代替UndirectedGraph确实会产生任何后果(至少我没有看到)。

4

2 回答 2

1

鉴于 JUNG 将树定义为有向图,因此将森林也定义为有向图当然是有意义的——有向图的联合是有向图。

这将您的问题减少到 Tree 是否应该扩展 DirectedGraph。树是图当然是有道理的:它们肯定有节点和边,你上面引用的定义将它们定义为特定类别的图。那么问题就变成了,树应该被引导吗?

考虑所有边都指向根的有向树(这些在联合查找算法中使用)或所有边都指向远离根的有向树通常是有意义的(搜索树就是一个例子)。但是,考虑无向树(例如无向图的生成树)也是有意义的。

对我来说有点令人惊讶(但不是“错误”),设计师选择指定所有树都是有向的,而没有指定边的方向和树结构之间的关系。也就是说,我认为简单地指定 Tree extends Graph 是合理的,并让特定的实例化进一步指定树是有向还是无向,或者我会选择一个约定(指向或远离根)并在 javadoc 中明确指定该约定。开发人员选择的解决方案强制 Tree 实现者指定其边缘的方向,以防止 Tree 用户使用该结构。例如,如果用户知道所有边都指向远离根的,他们可以通过从根开始并访问所有离开根的边来遍历图,但如果他们不知道他们必须考虑两个传入和出边。

由于 Java 的 instanceof 测试,实现没有方法的接口可能会产生后果。例如,图形绘制例程可以检查图形是否是有向图的实例,如果是,则绘制箭头而不是直线。

最后一点,在尝试理解图书馆中使用的术语时,我会在访问 Wikipedia 或任何其他来源时要小心,因为通常不同的人会为事物选择微妙的不同含义。例如,在某些库中,“Graph”实际上意味着“有向加权图”。你最好去javadoc。

于 2013-03-08T05:20:46.673 回答
1

JUNG 的Forest接口定义getChildrengetParent方法。这些是人们通常期望与树木和森林相关联的方法,除非图形是有向的,否则这些方法是没有意义的。

此外,没有此类方法签名的 Forest 或 Tree 接口也没有任何意义。确实,在图论中,树只是一个连通的无环图。但是没有任何方法(至少具有通用性)适用于通常不适用于图的无向边的树。也就是说,你当然可以创建一个Graph 的实现,它将自己限制为具有无向边的树——你可以自由地这样做。

于 2013-03-08T15:42:55.693 回答