我正在实施一些算法来教自己关于图形以及如何使用它们。你会推荐什么是在Java中最好的方法?
我只是想问你,如果你能给出一个简短的帮助,只需简单的有序图和加权有向图的类定义?
我浏览了网页,但我不想要它的实现,只是对类的简短定义....你认为最好的数据结构是什么?相邻列表?
对于无向图,我将其定义如下:
public interface Graph {
Collection vertices(); // returns a collection of all the
// Vertex objects in the graph
Collection edges(); // returns a collection of all the
// Edge objects in the graph
Collection incidentEdges(Vertex v); // returns a collection of
// Edges incident to v
boolean isAdjacent(Vertex v, Vertex w); // return true if v and
} // w are adjacent
public class Vertex {
public boolean visited; // initially false for all vertices
}
public class Edge {
Vertex v1, v2; // undirected edge
Vertex opposite(Vertex v); // given a vertex return the one
} // at the other end of this edge
答案 0 :(得分:1)
这是一个简单的实现(对于许多基本用例来说应该足够了):
public class Graph {
public List<Node> nodes = new ArrayList<Node>();
}
public class Node{
public List<Node> neighbors = new ArrayList<Node>();
//here you can add stuff like "public boolean visited;", if your algorithm requires it
}
(这只是一个例子 - 有很多方法可以实现图形结构)。
答案 1 :(得分:0)
要使用的数据结构取决于代码的用途...列表通常做得很好,但如果图形高度连接(大多数节点连接到大多数节点),那么列表很麻烦,并且通常首选某种矩阵。
例如,要使用矩阵,请保留节点矢量,然后使用整数的二维矢量来引用节点。
此外,为了创建一个轻量级类,您不必为节点声明一个类:您可以提供添加节点和边的函数,并且可以使用整数来标识这些元素。
如果您计划对它们进行子类化(例如,在执行显示图形的GUI时可能很有用),那么使用Node或Edge类可能是合适的,但如果您需要某些算法的图形,则使用整数标识节点/边缘更快更简单。