繁体   English   中英

我的Java图形实现需要一些建议

[英]Need some advice for my graph implementation with java

我想实现一些图形算法,这就是为什么我要创建一种图形框架的原因。 到目前为止,我通过以下课程非常容易地实现了有向图

class Vertex {
    String id;
    String name;
}


class Edge {
    String id;
    Vertex source;
    Vertex destination;
    int weight;
}

class Graph {
     List<Vertex> vertexes;
     List<Edge> edges; }

测试时,我创建:

Edge edge = new Edge(id, source_node, destination_node, weight)

在有向图这是完全可以的。 但是在无向图中 ; 我必须这样写; 假设我们有2个节点,分别是A,B,并且它们之间的权重是10。因此,由于无向图的结构,我不得不放置两个边;

Edge e1 = new Edge(id1, A, B, 10)
Edge e2 = new Edge(id2, B, A, 10)

这种类型的边缘创建效率低下且穷举。

因此,如何修改代码,这样我就不必在两个节点之间放置两个无向图的边。 将无向图类型集成到我的代码中的最佳方法是什么?

谢谢你的时间。

最近我碰到了一个有趣的Java API,称为Tinkerpop的 Blueprints ,您可以使用它,或者着眼于获得有关如何实现自己的图形框架的一些想法。

我正在开发一个利用JSON的图形框架。 这是由于图的可变性。 图论中的算法倾向于将数据添加到其他算法使用的图上。 Ergo尝试具体描述图形具有固有的缺陷。

自然的解决方案是使边缘的方向成为属性。 创建一个枚举:

public enum EdgeType {
     Undirected,
     From1to2,
     From2to1,
     Cyclic
}

然后向您的Edge类添加一个属性:

public EdgeType enumEdgeType;

在进行遍历和其他操作时,可以使用switch语句来处理4种不同的情况。 我的经验是,这种方法最简单,最有效。

我将不同意现有的答案...

通常,在代码中表示图形时,出于效率方面的考虑,您不希望将边存储为一个大列表,甚​​至根本不存储为对象。 您通常将需要使用邻接矩阵 (对于相对密集的图)或邻接列表 (对于相对稀疏的图)。 这使您可以轻松查找顶点的邻居,这通常是您在图形算法中使用的。 因此,通常在实现中,您需要的只是索引数组或Vertex对象集或列表。

在无向图中,您将边(i,j)以及(j,i)到数据结构中。 在有向图中,您只需添加其中一个即可。

根据要实现的图形算法,您将需要不同的图形表示,因此您将必须能够使用其中的几种。 大多数算法使用邻域列表,而在代码中使用边列表。

您真的不必担心边缘创建。 在大多数情况下,与实际算法相比可以忽略不计。 现在,根据您要尝试执行的操作,可能仅需要一条边,但是在大多数情况下,两条边都非常好且理智。

我将不同意关于蓝图的答案。 这个库周围有很多炒作,除了图形实现抽象的出色功能之外,图形算法(熔炉)程序包中绝对没有实现任何东西,从而使复杂的堆栈完全无用。

当我说什么都没实现时,那实际上什么也没做(请看这里 ),并且回购已经有一段时间没有更新了,因此您可以认为它已经死了。 如果您想使用

我的2美分,使用经验丰富的图形框架: Jgrapht 我将其用于几个研究项目,实现了20个标准(和一些非平凡的) 图形算法 因此,您无需重新发明轮子。 它还支持大量图形类型

避免大肆宣传,寻求可行的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM