Java分组点,可以落在矩形中

Java分组点,可以落在矩形中,java,algorithm,Java,Algorithm,我正在做一项研究,我一直致力于高效地解决一个算法。如果有人在这方面帮助我,我会非常有帮助- 阿尔戈- 我有一组点(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,

我正在做一项研究,我一直致力于高效地解决一个算法。如果有人在这方面帮助我,我会非常有帮助-

阿尔戈-

我有一组点(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)
说明-如果10x10的矩形从点p1开始,则点p1和p2将落在矩形中。如果矩形从点p3开始,则类似的p3和p5将落在10x10的矩形中。如果我们能找出包围它们的每个矩形的坐标,这也会很有帮助

注意:一个点可以属于两个不同的组。在这种情况下,所有点都将被视为一个组,然后矩形的大小将增大

我试过的-

我试着取p1点坐标,并将其x&y与其他点进行比较。如果我发现p2点靠近它。我将它们添加到一个组中,然后从比较其他组中跳过p2。我用p3再次开始这个过程

这似乎不是一个有效的解决方案,因为在最坏的情况下,它可能具有非常糟糕的nxn复杂性


注:我要求大家不要认为这是一个作业,因为它不是。

< P>为了从聚类问题中获得任何合理的性能,你需要先把你的数据组织成适合你的算法要求的数据结构。您试图解决的问题可能非常适合“k-d树”

一旦您将数据组织到一个k-d树中,您就可以更有效地询问有关各个节点之间距离关系的问题


这里有一个关于k-d树的java实现的stackoverflow问题

您需要定义一个数据结构来保存所需的信息,而不是一个算法。这里有一种定义数据结构的方法

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;
        }

    }

}
package com.ggl.fse;
导入java.awt.Point;
导入java.awt.Rectangle;
导入java.util.ArrayList;
导入java.util.List;
公共类矩形群{
私人名单点;
私有矩形边框;
公共矩形组(整型宽度,矩形点){
this.points=new ArrayList();
此.points.add(rPoint);
点p=rPoint.getPoint();
this.boundingRectangle=新矩形(p.x,p.y,width,width);
}
公共布尔检查点(矩形点rPoint){
如果(isBound(rPoint)){
添加点(rPoint);
返回true;
}否则{
返回false;
}
}
公共布尔值isBound(矩形点rPoint){
返回boundingRectangle.contains(rPoint.getPoint());
}
公共类矩形点{
专用点;
私有字符串标签;
公共矩形点(字符串标签,整数x,整数y){
此(标签,新点(x,y));
}
公共矩形点(字符串标签,点){
this.label=标签;
这个点=点;
}
公共点getPoint(){
返回点;
}
公共字符串getLabel(){
退货标签;
}
}
}
可以创建矩形组实例的列表。必须针对所有矩形组实例测试每个新矩形点

我使用了AWT包中的Point和Rectangle类


如果一个矩形点适合多个矩形组,您以后必须组合矩形。

一个点可以属于两个不同的组吗?如果我理解正确,这是一个分区问题。它们往往在计算上很繁重。需要注意的一点是,如果您将它们按X排序,您可以找到候选点的子集。要在给定点的10范围内,另一点的两个坐标必须在10范围内。例如(0,0),(9,9),(11,11)这样模棱两可的情况如何?(9,9)与(0,0)和(11,11)在一个10x10的矩形中,但不是彼此。是的,它们可以属于两个不同的组。在这种情况下,它们将被视为一个组,然后矩形的大小将变为20x20。这里的目标是什么?这是一个最小化问题,找到包含所有点的最小矩形数?如果是这样的话,20x20矩形和10x10矩形一样好,还是“成本”更高?另外,矩形是否总是正方形,或者它们是否可以以其他方式组合——比如说10x20,甚至12x12?(0,0)-(9,9)是10x10的高度和宽度,所以你确定gp2->p3(40100),p5(40,90)?(31,81)->(49,99)未达到(40100)。还是我错了?