我正在进行一项研究,我一直坚持以有效的方式解决算法。如果有人帮助我,我会非常有帮助 -
Algo -
我有一组点(x1,y1),(x2,y2)......(可以是10000点)。我想在一组中打印点 - 可以用10x10的矩形包围。
示例 -
p1 (10,10)
p2 (15,15)
p3 (40,100)
p4 (40,50)
p5 (40,90)
p6(200,200)
p7(400,350)
output
gp1 -> p1 (10,10), p2 (15,15)
gp2 -> p3 (40,100), p5 (40,90)
说明 - 如果从点p1开始10x10的矩形,则点p1和p2将落在矩形中。类似的p3&如果矩形将从点p3开始,p5将落在10x10的矩形中。如果我们能够找到包围它们的每个矩形的坐标,也会有所帮助。
注意:单个Point可以属于2个不同的组。在这种情况下,所有将被视为一个组,然后矩形的大小将增长
我尝试了什么 -
我试图采取点p1坐标并比较其x&和别人一起如果我发现点p2靠近它。我将它们添加到一个组中,然后跳过p2来比较其他组。我用p3再次开始处理。
它似乎不是一个有效的解决方案,因为在最坏的情况下,它可能具有非常复杂的nxn复杂性。
注意:我请求大家不要将此视为作业,因为它不是。
答案 0 :(得分:1)
为了从群集问题中获得任何合理的性能,您需要首先将数据组织成符合算法要求的数据结构。您试图解决的问题可能非常适合" k-d树" http://en.wikipedia.org/wiki/K-d_tree
将数据组织到k-d树后,您可以更有效地询问有关各节点之间距离关系的问题。
这里有一个关于k-d树的java实现的stackoverflow问题。 KDTree Implementation in Java
答案 1 :(得分:1)
您需要定义一个包含所需信息的数据结构,而不是算法。这是定义数据结构的一种方法。
package com.ggl.fse;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
public class RectangleGroup {
private List<RectanglePoint> points;
private Rectangle boundingRectangle;
public RectangleGroup(int width, RectanglePoint rPoint) {
this.points = new ArrayList<RectanglePoint>();
this.points.add(rPoint);
Point p = rPoint.getPoint();
this.boundingRectangle = new Rectangle(p.x, p.y, width, width);
}
public boolean checkPoint(RectanglePoint rPoint) {
if (isBound(rPoint)) {
points.add(rPoint);
return true;
} else {
return false;
}
}
public boolean isBound(RectanglePoint rPoint) {
return boundingRectangle.contains(rPoint.getPoint());
}
public class RectanglePoint {
private Point point;
private String label;
public RectanglePoint(String label, int x, int y) {
this(label, new Point(x, y));
}
public RectanglePoint(String label, Point point) {
this.label = label;
this.point = point;
}
public Point getPoint() {
return point;
}
public String getLabel() {
return label;
}
}
}
您可以创建一个RectangleGroup实例列表。必须针对所有RectangleGroup实例测试每个新的RectanglePoint。
我使用了AWT包中的Point和Rectangle类。
如果RectanglePoint适合多个RectangleGroup,则必须稍后组合矩形。