【发布时间】:2011-02-26 19:57:03
【问题描述】:
我在以下代码中收到错误 java.lang.NullPointerException 错误。
算法:
- 如果 n ≤ 3 通过蛮力找到最近的点并停止。
- 找到一条垂直线 V,以便将输入集分成大小尽可能相等的两个不相交的子集 PL 和 PR。左边或线上的点属于 PL,右边或线上的点属于 PR。由于集合是不相交的,因此没有任何点属于两者。
- 递归地找到 PL 中最近的一对点的距离 δL 和最近的一对点的距离 δR 在 PR 中配对。
- 令 δ = min(δL, δR)。输入集 P 中一对最近点的距离或者是在递归步骤中找到的点的距离(即 δ),或者由 PL 中的一个点和 PR 中的一个点之间的距离组成。
- 只有一个来自 PL 和一个来自 PR 的候选点必须在一个垂直条中,包括 线 V 左侧距离 δ 的线和 V 右侧距离 δ 的线
- 令 YV 为条带内的点数组,按非递减 y 坐标排序 (即,如果 i ≤ j 则 YV [i] ≤ YV [j])。
- 从 YV 中的第一个点开始,并通过除最后一个点之外的所有点,检查该点与接下来的 7 个点的距离(如果少于 7 个,则检查剩下的任何点)。如果发现一对距离严格小于 δ,则将此距离分配给 δ。
- 返回 δ。
底线是,它使用概念扫描线和递归来找到欧几里得空间中的最近点。
现在我要写的方法:
-
public static int cP(pointSet P).这为算法的递归部分做准备工作,并为递归部分调用方法closestPairAux。
public static int cPA(Point [] X, Point [] Y).该方法执行算法的递归部分;也就是大部分工作。
其他方法和类
平面中的点由Point 类的对象表示。这很明显;它将 x 和 y 坐标保存为数字,因此如果 P 是 Point 类型的对象,则 P.x 和 P.y
输入点的集合由 PointSet 类的对象表示。因为这是 一个集合不能有一个点的重复,我们不能假设元素有任何顺序。
-
public static PointSet gP(String f).这会打开一个名为 f 的文件并从中读取点。
-
public Point nP(PointSet P).这是用来对P中的点进行迭代。算法
closestPair由方法实现 -
公共静态点最接近对(PointSet P)。
- 如果 n = 2 则返回 (x1 - x2)^2 + (y1 - y2)^2
- 其他
- d ← 0
- for i ← 1 to n − 1 do
- 对于 j ← i + 1 到 n 做
- t ← (xi − xj)^2 + (yi − yj)^2
- 如果 t
- d ← t
- 返回 d
-
public static PointSet generatePoints(int n).这会返回一组 n 个点,其坐标是整数。
-
public Point[] sort(char c).这将返回数组中点集中的点,该数组按参数 c 指示的坐标按非递减顺序排序。此参数采用值“x”或值“y”,否则将引发异常 UnknownSortOptionException。
这是我到目前为止写的:
我决定第一个方法应该做琐碎的情况,n=
public static int cP(PointSet P)
throws TrivialClosestPairException, UnknownSortOptionException
{
int distance = 0;// a method form the Poirnt class that calculate the square distance between this point and another point
Point[] x = P.sort('x');
Point[] x = P.sort('y');
distance = cPA(x, y); **->here**
return distance;
}
此方法是否按应有的定义?
第二个:我需要大量帮助来解决这个问题。
public static int cPA(Point[] X, Point[] Y)
throws TrivialClosestPairException, UnknownSortOptionException
{
if (X.length<4){
return PointSet.nCP(new PointSet (X));
}
int V = X[(int) Math.ceil(( (double) X.length/2)-1)].getX();
Point[] PL = Arrays.copyOfRange(X,(int) 0,(int) Math.ceil(X.length/2));
Point[] PR = Arrays.copyOfRange(X,(int) Math.floor(X.length/2), (int) X.length-1);
int distance = Math.min(cPA(PL,Y),cPAPR,Y));**->here**
Point[] shortDist = new Point[Y.length];
int n = 0;
for (int i = 0; i <Y.length; i++)
{
int A = Y[i].getY();
if ((V-A)*(V-A) <= distance)
{
shortDist[n] = Y[i];
}
}
for (int i =0; i< shortDist.length -1; i++)
{
for (int r = i+1; r <shortDist.length-1 && r< i + 7; r ++){
distance = Math.min(d, shortDist[i].sqrDist(shortDist[r]));**->here**
}
}
return distance;**->here**
}
现在当我定义以下类来测试我的方法时
public class Test{
public static void main(String [ ] args)
{
ClosestPair.closestPairCheck( 10, 10);
//生成 t 组大小为 n 的点,并获得声称的最近点的平方距离 使用您对每个集合的方法最接近对的实现进行配对。如果所有结果 是正确的,则返回一条报告此问题的消息,否则报告失败。没有进一步的 给出了信息。请注意,t 必须严格为正(一个例外 Invalid- 否则会引发 NumberOfTestsException)。 } }
当我给出可变距离值时,我在线程“main”java.lang.NullPointerException 中的 3 个位置出现以下异常(我在上面记下了)...我该怎么办?
【问题讨论】:
-
这是作业吗?如果是这样,请标记它。
-
不是真的...运行时与此无关
-
我为您的问题添加了一些格式,这可能有助于理解它。还有一些不清楚的地方,你应该再看一遍:你只需要找到最小距离,还是你也想自己得到对?
-
哎呀,@Paulo,我也是。很抱歉,我没有收到关于您的编辑的警告。