我目前正在学习数据结构(例如LinkedList,DoublyLinkedList,ArrayList,...),我想知道如何在Java中实现(非定向)图形。
我在考虑两个课程:Graph
和Node<T>
每个节点应该知道它连接的是哪个其他节点(List<Node<T>>
是否合适?什么样的List最好?)
然后,Graph
类可以提供boolean contains(T element)
Node
类没有其他用途,那么如何限制可见性以便只有Graph
才能访问?
编辑:此外,我如何权衡节点之间的连接?我想我需要一个与上面提到的完全不同的实现,因为一个简单的连接节点列表是不够的?
答案 0 :(得分:1)
您可以将Node设为私有内部类:
public class Graph<T> {
/* code */
private class Node<T> {
/* code */
}
}
对于链接权重:不是将相邻节点保存为列表,而是将它们保存为HashMap<Node, Double>
,将每个节点映射到一定的权重。
注意:此实现实际上是一个有向图。
答案 1 :(得分:1)
图是有序对G =(V,E),包括一组顶点 或节点或点与边缘或弧或线的集合E, 这是2元素子集
以下定义应该为您提供一种组织图表的明确方法。它由Set<Node>
和Set<Edge>
组成(实现肯定是HashSet
)。 Edge
是一对from
和to
Node
。 Edge
可以为加权图提供属性cost
。如果您需要无向图,则可以存储指示一个无向边的两个有向Edge
或向undirected
类添加属性Edge
。
public class Graph<T> {
private Set<Node<T>> nodes;
private Set<Edge<T>> edges;
private class Node<T> {
private T value;
}
private class Edge<T> {
private Node<T> to;
private Node<T> from;
private Number cost;
}
}
答案 2 :(得分:0)
我建议您应该学习一个名为JGraphT的第三方包,并研究它如何构建具有不同属性的图。