[英]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.