简体   繁体   English

Java - Graph的最佳实现结构是什么?

[英]Java - Which is the best implementation structure for Graph?

The graph is very large but undirected. 该图非常大但无向。 Edges are unweighted. 边缘没有加权。

In my implementation, I have to find the vertex with max degree and do deletion on both vertexes and edges. 在我的实现中,我必须找到具有最大度数的顶点并在顶点和边上执行删除。

Linked list? 链接列表? ArrayList? 数组列表? Map? 地图?

Which one is better for my implementation? 哪一个更适合我的实施?

The two fundamental data structures for representing graphs are the 表示图形的两个基本数据结构是

  • adjacency list

  • the adjacency matrix

see http://en.wikipedia.org/wiki/Adjacency_list and http://en.wikipedia.org/wiki/Adjacency_matrix . 请参阅http://en.wikipedia.org/wiki/Adjacency_listhttp://en.wikipedia.org/wiki/Adjacency_matrix
The articles also discuss the pros and cons of those two structures. 文章还讨论了这两种结构的利弊。

My suggestion would be to store the vertexes in a priority queue. 我的建议是将顶点存储在优先级队列中。 That way you can have very fast access to the vertex with the highest degree. 这样,您可以非常快速地访问具有最高程度的顶点。 As for how to implement the vertexes, I would store each neighboring vertex in some kind of set data-structure such as a HashSet or a TreeSet to be able to remove stuff efficiently. 至于如何实现顶点,我会将每个相邻顶点存储在某种集合数据结构中,例如HashSet或TreeSet,以便能够有效地删除内容。 I wouldn't represent the edges explicitly, it's not needed. 我不会明确地表示边缘,不需要它。

Code, something along the lines of: 代码,类似于:

class Graph {

  PriorityQueue<Vertex> vertexes;

  public Graph() {
    vertexes = new PriorityQueue<Vertex>(10,new Vertex());
  }

  public Vertex maxDegreeVertex() {
    return vertexes.peek();
  }

  ...

}

class Vertex implements Comparator<Vertex> {
  HashSet<Vertex> edges;

  public Vertex() {
    edges = new HashSet<Vertex>();
  }

  public compare(Vertex v1, Vertex v2) {
    v2.edges.size().compareTo(v1.edges.size());
  }

  ...

}

Hope this helps. 希望这可以帮助。

From the above suggested the answer would be 从上面提出的答案是

Map with LinkedList... 使用LinkedList映射...

Your datastructure could be like this(varies according to your requirement)... 您的数据结构可能是这样的(根据您的要求而变化)......

Map<?, List<?>>
<Node-name, List-of-nodes-connected-to-it>

Basically, Graphs are best implemented with the help of HASHING and the above datastructure helps a lot in that.. 基本上,图表最好在HASHING的帮助下实现,上述数据结构对此有很大帮助。

If your algorithm requires looking up on max degree, then you want a data structure ordered by degree, something like a PriorityQueue would be good. 如果你的算法需要查看最大度数,那么你想要一个按度数排序的数据结构,像PriorityQueue这样的东西会很好。

Then you need to store the graph itself. 然后你需要存储图表本身。 For deletion quickly I'd recommend something like a Sparse Array structure. 为了快速删除,我建议使用稀疏数组结构。 If you have to use java.util data structures, then a HashMap from vertexes to the list of connected vertexes offers O(1) deletion. 如果必须使用java.util数据结构,则从顶点到连接顶点列表的HashMap提供O(1)删除。

If you could use 3rd party libraries, then there are a list of answers here of which JGraph and JUNG seem most popular. 如果您可以使用第三方库,那么这里有一个答案列表 ,其中JGraph和JUNG似乎最受欢迎。

Graph implementation depends on what you going to do with it. 图表实现取决于您将如何处理它。 But for most cases Adjacency list based implementation helps. 但对于大多数情况,基于邻接列表的实现有帮助。

In Java you can do it using a Map<>. 在Java中,您可以使用Map <>来完成。 Here is generic Adjacency List based Graph.Java implementation on my blog. 这是我博客上基于通用邻接列表的Graph.Java实现。

您还可以查看专门设计的库,例如JUNG

Depends on what other requirements you have. 取决于您有什么其他要求。 A naive, simple approach could be 一种天真,简单的方法可能是

class Node
{
  List<Node> edges;
  int id;
}

where you'd have a List of all the nodes in the graph. 你有一个图表中所有节点的列表。 The problem is this can become inconsistent; 问题是这可能会变得不一致; eg node A might be in node B's edges list, but node B might not be in node A's list. 例如,节点A可能位于节点B的边缘列表中,但节点B可能不在节点A的列表中。 To get around this, you could model it as such: 要解决这个问题,您可以将其建模为:

class Edge
{
  Node incidentA;
  Node incidentB;
}

class Node
{
  int id;
}

Again, you'd have List and List of all the edges and nodes in the system. 同样,您将拥有系统中所有边和节点的列表和列表。 Of course analyzing this data structure would be done in a very different way than in the other approach. 当然,分析这种数据结构的方式与其他方法完全不同。

    public class Graph {
    private Set<Vertex>vertices;
    private Set<Edge>edges;
    private Map<Vertex,List<Edge>>adj;
    // Getter setter



    public Graph(Set<Vertex> vertices, Set<Edge> edges, Map<Vertex, List<Edge>> adj) {
        super();
        this.vertices = vertices;
        this.edges = edges;
        this.adj = adj;
    }
}

// Vertex class
public class Vertex {
    private String name;

    public Vertex(String name) {
        super();
        this.name = name;
    }


}

// Edge class 

public class Edge {
    private Vertex from;
    private Vertex to;
    private int weight;

    public Edge(Vertex from, Vertex to,int weight) {
        super();
        this.from = from;
        this.to = to;
        this.weight = weight;
    }


}

// Driver class 

import java.util.HashSet;
import java.util.Set;

public class Test {
    public static void  main(String[]args) {
        Graph gr = new Graph();
        Vertex a = new Vertex("a");
        Vertex b = new Vertex("b");
        Vertex c = new Vertex("c");
        Vertex d = new Vertex("d");
        Vertex e = new Vertex("e");
        Vertex f = new Vertex("f");
        Vertex g = new Vertex("g");


        Set<Vertex>vertices = gr.getVertices();
        if(vertices == null){
            vertices  = new HashSet<>();
            vertices.add(a);
            vertices.add(b);
            vertices.add(c);
            vertices.add(d);
            vertices.add(e);
            vertices.add(f);
            vertices.add(g);
        }

        Edge ae = new Edge(a, e, 3);        
        Edge ac = new Edge(a, c, 1);
        Edge cf = new Edge(c, f, 9);
        Edge cd = new Edge(c, d, 4);
        Edge eb = new Edge(e, b, 2);
        Edge bd = new Edge(b, d, 5);
        Edge df = new Edge(d, f, 7);

    Set<Edge>edges = gr.getEdges();
    if(edges == null){
        edges = new HashSet<Edge>();
        edges.add(ae);
        edges.add(ac);
        edges.add(cf);
        edges.add(cd);
        edges.add(eb);
        edges.add(bd);
        edges.add(bd);
    }
        gr.setVertices(vertices);
        gr.setEdges(edges);

    }

}

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

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