簡體   English   中英

在 DFS/BFS 算法中獲取鄰居時避免內存分配?

[英]Avoid memory allocations while getting neighbors in a DFS/BFS 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 ...
}

我的問題是,我覺得每次處理單元格時創建新鄰居列表的過​​程似乎很浪費,尤其是因為鄰居列表只使用一次。 關於如何重寫以避免每次都創建一個新列表的任何建議 - 主要是為了利用我每次調用只需要遍歷鄰居一次的事實?

關於如何重寫以避免每次都創建新列表的任何建議

您可以將result列表聲明為實例變量。 這樣,您可以在每次完成對鄰居的迭代時清除它:

for (Point neighbor : results) {
    ... Do stuff ...
}
results.clear();

主要是利用我每次調用只需要遍歷鄰居一次的事實?

您應該對您的代碼進行基准測試,看看這是否真的比以前的方法具有性能優勢。

函數式方法也可以在這里工作; 我不熟悉 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。 但同樣,不清楚這是否會帶來顯着的節省,因此需要進行基准測試來確定以這種方式重構是否值得。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM