我现在坚持这个问题几天了,我真的想得到一些帮助。
给予(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;
}
}