私は2つの長方形の交差点を取得しようとしています。私は動作するメソッドがありますが、40000四角形のアルゴリズムでテストすると、OutOfMemoryエラーが発生します。交差点をチェックする時間は完全にO(n²)ですが、時間はかかりません。 私はメモリが足りないのは、オブジェクトが多すぎるからだと思うが、時間がかかるのはO(n²)(倍増テストでテストされていない)が私には意味がなく、なぜそれはそうしています。長方形の交点を取得するO(n²)とOutOfMemory以外
は、これは私がメモリとCPUの効率的としてこれを作ってみました
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());
}
}
交差点を取得するための私のコードですが、まだそれはそれが必要として動作しません。 何か助けていただければ幸いです。
EDIT:この関数を呼び出す アルゴリズム:
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