Java: how to represent graphs?

前端 未结 12 1455
感动是毒
感动是毒 2020-12-02 12:17

I\'m implementing some algorithms to teach myself about graphs and how to work with them. What would you recommend is the best way to do that in Java? I was thinking somethi

相关标签:
12条回答
  • 2020-12-02 12:43
    class Vertex {
        private String name;
        private int score; // for path algos
        private boolean visited; // for path algos
        List<Edge> connections;
    }
    
    class Edge {
        private String vertex1Name; // same as Vertex.name
        private String vertex2Name;
        private int length;
    }
    
    class Graph {
        private List<Edge> edges;
    }
    
    0 讨论(0)
  • 2020-12-02 12:45

    I'd recommend graphviz highly when you get to the point where you want to render your graphs.

    And its companions: take a look at Laszlo Szathmary's GraphViz class, along with notugly.xls.

    0 讨论(0)
  • 2020-12-02 12:50

    Each node is named uniquely and knows who it is connected to. The List of connections allows for a Node to be connected to an arbitrary number of other nodes.

    public class Node {
        public String name;
        public List<Edge> connections;
    }
    

    Each connection is directed, has a start and an end, and is weighted.

    public class Edge {
        public Node start;
        public Node end;
        public double weight;
    }
    

    A graph is just your collection of nodes. Instead of List<Node> consider Map<String, Node> for fast lookup by name.

    public class Graph {
        List<Node> nodes;
    }
    
    0 讨论(0)
  • 2020-12-02 12:51

    When learning algorithms, the programming language (Java) should not be considered in deciding the representation. Each problem could benefit from a unique representation, and moreover designing it can add a bit of learning. Solve the problem first without relying on a particular language, then the representation for any particular language will flow naturally.

    Of course, general representations and libraries are useful in real-world applications. But some of them could benefit from some customization as well. Use the other answers to know the different techniques available, but consider customization when appropriate.

    0 讨论(0)
  • 2020-12-02 12:54
    class Graph<E> {
        private List<Vertex<E>> vertices;
    
        private static class Vertex<E> {
            E elem;
            List<Vertex<E>> neighbors;
        }
    }
    
    0 讨论(0)
  • 2020-12-02 12:54

    A simple representation written by 'Robert Sedgwick' and 'Kevin Wayne' is available at http://algs4.cs.princeton.edu/41graph/Graph.java.html

    Explanation copied from the above page.

    The Graph class represents an undirected graph of vertices named 0 through V - 1.

    It supports the following two primary operations: add an edge to the graph, iterate over all of the vertices adjacent to a vertex. It also provides methods for returning the number of vertices V and the number of edges E. Parallel edges and self-loops are permitted. By convention, a self-loop v-v appears in the adjacency list of v twice and contributes two to the degree of v.

    This implementation uses an adjacency-lists representation, which is a vertex-indexed array of Bag objects. All operations take constant time (in the worst case) except iterating over the vertices adjacent to a given vertex, which takes time proportional to the number of such vertices.

    0 讨论(0)
提交回复
热议问题