我試圖獲得兩個矩形的交點。我有一個方法,但是當我用40000矩形的算法測試它時,我得到一個OutOfMemory錯誤。我檢查交叉點的次數完全是O(n²),但所花費的時間不是。 我認爲內存不足是因爲有太多的對象,但它所需要的時間不是O(n²)(用雙倍測試測試)對我來說沒有意義,我不明白爲什麼它是這樣做的。獲取矩形的交點不是O(n²)和OutOfMemory
這是我得到的交集
public void getIntersections(Rectangle r, Collection<double[]> c) {
x1 = Math.max(this.getLowerLeftX(), r.getLowerLeftX());
y1 = Math.max(this.getLowerLeftY(), r.getLowerLeftY());
x2 = Math.min(this.getUpperRightX(), r.getUpperRightX());
y2 = Math.min(this.getUpperRightY(), r.getUpperRightY());
if(this.contains(x1,y1) && r.contains(x1,y1)) {
inter[0] = x1;
inter[1] = y1;
c.add(inter.clone());
}
if(this.contains(x1,y2) && r.contains(x1,y2)){
inter[0] = x1;
inter[1] = y2;
c.add(inter.clone());
}
if(this.contains(x2,y1) && r.contains(x2,y1)){
inter[0] = x2;
inter[1] = y1;
c.add(inter.clone());
}
if(this.contains(x2,y2) && r.contains(x2,y2)){
inter[0] = x2;
inter[1] = y2;
c.add(inter.clone());
}
}
我試圖使這是內存和CPU高效的代碼,但它仍然無法正常工作,因爲它應該。 任何幫助,不勝感激。
編輯: 調用該函數的算法:
public void execute() {
List<Rectangle> rectangles = this.getRectangles();
Queue<Rectangle> q = new LinkedList<Rectangle>();
q.addAll(rectangles);
System.out.println(q.size());
while(!q.isEmpty()){
Rectangle check_rect = q.poll();
for (Rectangle rect: q) {
check_rect.getIntersections(rect, this.getIntersections());
}
}
}
輔助功能:
public boolean contains(double x, double y){
return ((x == this.getLowerLeftX() || x == this.getUpperRightX()) ||
(y == this.getLowerLeftY() || y == this.getUpperRightY())) &&
x >= this.getLowerLeftX() && x <= this.getUpperRightX() &&
y >= this.getLowerLeftY() && y <= this.getUpperRightY();
}
對於交叉口的集合,我使用:
this.intersections = new ArrayDeque<>();
的OutOfMemory例外總是當它試圖放大ArrayDeque時發生>(),它只將交點存儲在double [2]中。所以看起來40000個矩形之間的交叉點太多了。 另一個問題似乎是內存耗盡之前的迭代,它真的放慢速度,這是因爲交換或其他內存管理?
你看過性能下降的動態(1000,5000,10000矩形)嗎?你也應該提供調用這個方法的代碼,因爲問題可能在那裏。你的方法也適用於副作用,這被認爲是不好的做法。通常你想返回一個新的交集對象,而不是操縱輸入和全局變量。 – user3707125
你能否提供這裏使用的所有方法的實現?這意味着所有的'getLowerRight','getUpperLeft'等方法和'contains'方法。另外請包括'inter'數組的聲明 –
我添加了更多信息,以便您可以看到我在做什麼。 – Midasso