在DFS / BFS算法中获取邻居时避免内存分配?

时间:2017-01-29 16:36:04

标签: java algorithm

我正在编写一些代码来执行网格映射的DFS。我调用的一个函数是getNeighbors(...),它获取指定单元格的所有邻居:

public ArrayList<Point> getNeighbors(int i, int j) {
    ArrayList<Point> result = new ArrayList<>();
    for (Point n : upDownLeftRightDirections) {
        int dx = i + n.x;
        int dy = j + n.y;
        result.add(new Point(dx, dy));
    }
    return result;
}

... Later in the code ...

for (Point neighbor : getNeighbors(i, j)) {
    ... Do stuff ...
}

我的问题是,每次处理一个单元格时,我觉得这个过程似乎很浪费,特别是因为邻居列表只使用了一次。有关如何重写以避免每次创建新列表的任何建议 - 主要是为了利用每次调用我只需要迭代邻居一次的事实?

2 个答案:

答案 0 :(得分:1)

  

有关如何重写以避免每次都创建新列表的任何建议

您可以将import { Component } from '@angular/core'; @Component({ selector: 'my-app', //templateUrl: './app/app.component.html', template:` <div class="flex-container" fxFlex=100> <div class="colored box" > <div fxFlex.lg=100 fxFlex.md=50> flexible for screensize </div> <div fxFlex.lg=100> fxFlex </div> <div fxFlex=33> fxFlex </div> </div> </div> <div class="version">@angular/flex-layout (v2.0.0-beta.0)</div> `, styleUrls: ['./app/app.component.css'] }) export class AppComponent { } 列表声明为实例变量。这样,您可以在每次完成对邻居的迭代时清除它:

result
  

主要是为了利用我只需要迭代的事实   邻居每次通话一次?

您应该对代码进行基准测试,看看这是否真的比以前的方法具有性能优势。

答案 1 :(得分:0)

功能方法也适用于此;我不熟悉Java的深层语义,但有点像:

public void consumeNeighbors(Function f) {
    for (Point n : upDownLeftRightDirections) {
        int dx = i + n.x;
        int dy = j + n.y;
        f(dx, dy);
    }
}

这将避免在迭代邻居时创建新的Point对象和新的List。但同样,目前尚不清楚这会带来显着的节省,因此需要通过基准测试来确定以这种方式重构是否值得。