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

时间:2015-07-14 16:21:25

标签: java graph adjacency-list

我试图在java中使用邻接列表(表示图形的空间必须是O(m),其中m是边数)来表示图形(连接 - 非定向 - 无权重)使用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);
    }
}

2 个答案:

答案 0 :(得分:1)

虽然您当然可以使此表示有效,但您需要一种方法来访问Vertex number,而无需搜索整个图表。为了实现此目的,您需要v[]Vertex个对象的列表或数组,以使v[i].number始终等于i

由于你无论如何都需要这个数组/列表,你也可以用&#34;空&#34;预先填充它。 Vertex个对象,并更改表示形式以使用Vertex个对象而不是Integer个列表,从而减少间接性:

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);
    }
}

请注意,将visitedVertex一起存储可能不是一个好主意,因为visited是算法状态的一部分,而不是图表的一部分。您应该将visited布尔变量数组与您的表示分开,并且仅在BFS运行期间保留:

static void bfs(Vertex[] v, int start) {
    boolean[] visited = new boolean[graph.length];
    Queue<Vertex> q = new Deque<Vertex>();
    q.add(v[start]);
    while (q.peek() != null) {
        Vertex c = q.remove();
        if (visited[c.getNumber()]) {
            continue;
        }
        // Do something with the current vertex c
        ...
        // Mark c visited, and add its neighbors to the queue
        visited[c.getNumber()] = true;
        for (Vector a : c.neighbors()) {
            q.add(a);
        }
    }
}

答案 1 :(得分:1)

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

1。 如果你真的想将Vertex表示为一个类,那么让它的相邻顶点列表为a 列表与LT;顶点&GT;而不是List&lt; Integer&gt;

2。 由于您的Vertex类似乎不包含顶点的Integer值以外的任何信息,为什么不直接使用Integer? 然后该图表可以表示为

ArrayList<ArrayList<Integer>> graph;

其中graph [i]是连接到顶点i的顶点列表 这使得您无需从整数id到Vertex实例找到匹配项。