Java 使用空间O(边数)表示图形的邻接列表

Java 使用空间O(边数)表示图形的邻接列表,java,graph,adjacency-list,Java,Graph,Adjacency List,我试图使用邻接列表(表示图的空间必须是O(m),其中m是边的数目)在java中表示一个图(无权重的连通无向图),以便使用BFS查找一些信息。我从一个名为graph.txt的txt文件中获取有关图形的信息。我不确定是否使用空间O(m)来保存图形,也不确定这是否是保存图形以便使用BFS的好方法 public class Vertex { boolean visited = false; int number; ArrayList<Integer> adjList

我试图使用邻接列表(表示图的空间必须是O(m),其中m是边的数目)在java中表示一个图(无权重的连通无向图),以便使用BFS查找一些信息。我从一个名为graph.txt的txt文件中获取有关图形的信息。我不确定是否使用空间O(m)来保存图形,也不确定这是否是保存图形以便使用BFS的好方法

public class Vertex  {
    boolean visited = false;
    int number;
    ArrayList<Integer> adjList;
    public Vertex(int i) {
        this.number= i;
        adjList = new ArrayList<Integer>(); 
    }
    public void addNeighbor(int i) {
        this.adjList.add(i);
    }
}
公共类顶点{
布尔值=假;
整数;
数组列表;
公共顶点(int i){
这个数字=i;
adjList=新的ArrayList();
}
公共无效添加邻居(int i){
本.adjList.add(i);
}
}

虽然您当然可以使用此表示法,但您需要一种方法来通过其
编号访问
顶点
,而无需搜索整个图形。为了实现这一点,您需要一个
v[]
顶点
对象的列表或数组,这样
v[i]。number
始终等于
i

由于您无论如何都需要此数组/列表,您不妨使用“空”的
顶点
对象预先填充它,并将表示更改为使用
顶点
对象列表,而不是
整数
对象,从而减少间接性:

public class Vertex {
    int number;
    List<Vertex> adjList = new ArrayList<Vertex>();
    public Vertex(int i) {
        this.number= i;
    }
    public void addNeighbor(Vertex v) {
        adjList.add(v);
    }
}

是的,您的表示确实使用O(m)空间。鉴于你的陈述,我有两个不同的建议

一,。 如果您真的想将顶点表示为一个类,那么请将其相邻垂直的列表设置为一个类 列表而不是列表

二,。 既然顶点类似乎不包含顶点整数值以外的任何信息,为什么不使用整数本身呢? 然后,图形可以表示为

ArrayList<ArrayList<Integer>> graph;
ArrayList图;
其中,图[i]是连接到顶点i的顶点列表
这使得您不必查找从整数id到顶点实例的匹配项。

我并不想将顶点表示为类,我做的第一件事是将该图表示为ArrayList graph;但是我不确定我是否能做BFS和其他类似的事情,比如用这个表示打印每个级别的顶点。
ArrayList<ArrayList<Integer>> graph;