【问题标题】:Best Way to create Adjacency List in java?在java中创建邻接列表的最佳方法?
【发布时间】:2020-09-11 17:08:34
【问题描述】:

一般来说,要在java中创建n个节点的邻接列表,我们需要创建一个额外的循环来用空列表填充列表,如下所示-

for(int i=0;i<n;i++)
    adj.add(new ArrayList<>());

现在我们不得不添加元素,但是由于这个额外的循环,它浪费了时间。 有没有其他最好的方法来创建邻接表??????

【问题讨论】:

  • 有时您必须创建列表。当你第一次需要它并添加一些东西时,你当然可以懒惰地这样做。可能不值得努力。我们在这里讨论的是哪些邻接列表大小?一百万×一百万?或者您为什么要在此处保存 10 纳秒
  • 不,这不是在浪费时间。仅创建n 数组列表不会花费太多时间,除非您谈论的是数百万的数量级。您处理图表的算法需要高效。

标签: java algorithm graph


【解决方案1】:

如果我需要对图进行紧凑的表示,并且我可以按顺序获取每个顶点的邻居,我经常这样做:

//Concatenated adjacency lists for each vertex in order
ArrayList<Integer> adjList = new ArrayList<>();

//For each vertex, the end of its adjacency list in adjList
ArrayList<Integer> adjListEnds = new ArrayList<>();

for (int i=0; i<num_vertexes; ++i) {
    for (int adj : getNeighbors(i)) {
        adjList.add(adj);
    }
    adjListEnds.add(adjList.size());
}

现在,获取任何顶点的邻居:

int s = vertex>0 ? adjListEnds.get(vertex-1) : 0;
int e = adjListEnds.get(vertex);
for (int i = s; i<e; ++i) {
    processNeighbor(vertext, adjList.get(i));
}

当然,如果您希望它真正紧凑,那么您应该使用类似的包含原始ints 的数组列表,而不是Integer s。有时我自己滚动。有时我会使用 gnu trove。

【讨论】:

    猜你喜欢
    • 2018-03-02
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多