求解2d点与矩阵之间最短距离的Java算法

时间:2016-07-27 18:34:59

标签: java distance shortest

我现在坚持这个问题几天了,我真的想得到一些帮助。

给予(0-1不包括1)范围内的2维点,例如(0.5,0.2),以及N个其他点(也在0-1的范围内)。 问题的第一部分是实现“哑”算法,当给定某个点时,它将找到距离它最短的点,其复杂度为O(N)。

我坚持的部分需要在K上构建Matrix K,其中每个“单元格”将包含属于该单元格的点。一旦完成,当给定原始点时,我将需要仅在一些单元格而不是整个矩阵中搜索距离最短的点,这将导致更好的复杂性。

我原来的想法是将点分开,以便每个块都有一个属于他的点的arraylist,然后以某种方式通过主块(原点所属的块)并继续通过它是邻居,但实施它并不是很成功。

我非常感谢任何帮助/建议。

以下是我目前的情况:

public class Point {
    private double x;
    private double y;
    private Block b;
    public Point(double x, double y)
    {
        this.x=x;
        this.y=y;
    }

    public Point(double x, double y, Block b) //consrtuctor for complex case
    {
        this.x=x;
        this.y=y;
        b.points.add(this);
    }
    public double getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public double getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }

    public double distance(Point p)
    {
        double res=0;
        res = Math.sqrt(Math.pow(this.x-p.getX(),2)+Math.pow(this.y-p.getY(),2));
        return res;

    }
}

import java.util.ArrayList;


public class Block {
    private int x;
    private int y;
    public ArrayList<Point> points;

    public Block(int x, int y) {

        points = new ArrayList<Point>();
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }

}

import java.util.Random;


public class ComplexCase {
    private Block[][] blockMat;

    public ComplexCase(int k, int n)
    {
        Random generator = new Random();
        Point p1;
        Block b1;
        double x,y;
        int bx1,by1;
        int t;
        t = 1/k;
        blockMat = new Block[k][k];
        for (int i =0;i<n;i++)
        {
            x = generator.nextDouble();
            y = generator.nextDouble();
            bx1 = (int) (x/t);
            by1 = (int) (y/t);
            b1 = new Block(bx1,by1);
            p1 = new Point(x,y,b1);
        }
    }
    public Block[][] getBlockMat() {
        return blockMat;
    }

    public void setBlockMat(Block[][] blockMat) {
        this.blockMat = blockMat;
    }

}

0 个答案:

没有答案