可以落入矩形的Java分组点

时间:2015-01-22 16:03:58

标签: java algorithm

我正在进行一项研究,我一直坚持以有效的方式解决算法。如果有人帮助我,我会非常有帮助 -

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复杂性。

注意:我请求大家不要将此视为作业,因为它不是。

2 个答案:

答案 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,则必须稍后组合矩形。