[英]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种不同的情况。 我的经验是,这种方法最简单,最有效。
根据要实现的图形算法,您将需要不同的图形表示,因此您将必须能够使用其中的几种。 大多数算法使用邻域列表,而在代码中使用边列表。
您真的不必担心边缘创建。 在大多数情况下,与实际算法相比可以忽略不计。 现在,根据您要尝试执行的操作,可能仅需要一条边,但是在大多数情况下,两条边都非常好且理智。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.