我的程序没有分析正确
import java.util.ArrayList;
import java.util.Arrays;
public class Cloud {
private ArrayList<Point> points;
private double left;
private double right;
private double top;
private double bottom;
private final double epsilon = 10e-6;
/**
*
* @param p a Point
* @return whether p in the cloud
*/
public boolean hasPoint(Point p) {
return points.contains(p);
}
/**
* Constructor
* @param maxSize: points array size
*/
public Cloud(){
points = new ArrayList<Point>();
this.left = 0.0;
this.right = 0.0;
this.top = 0.0;
this.bottom = 0.0;
}
/**
*
* @param p
* if (size < maxSize) add p to points, increment size
* @return the boolean value returned by the ArrayList add method
*
*/
public boolean addPoint(Point p){
extremes();
return points.add(p);
}
/**
* Use the method toString of ArrayList
*/
public String toString(){
return points.toString();
}
/*
* return an array of the double extremes instance variables:
* left, right, top, bottom
*/
public double[] getExtremes(){
double[] ext = new double[4];
ext[0] = left;
ext[1] = right;
ext[2] = top;
ext[3] = bottom;
return ext;
}
/**
* Compute four double values:
* left: the x coordinate of a left-most Point
* right: the x coordinate of a right-most Point
* top: the y coordinate of a highest Point
* bottom: the y coordinate of a lowest Point
*
* and put them in the appropriate instance variables
*/
private void extremes(){
for (int i=0; i<points.size(); i++){
Point p = points.get(i);
if(p.getX() < left){
left = p.getX();
}
if(p.getX() > right){
right = p.getX();
}
if(p.getY() < bottom){
bottom = p.getY();
}
if(p.getY() > top){
top = p.getY();
}
}
}
/**
*
* @param p1
* @param p2
*
* all Points outside the rectangle, line or point spanned
* by p1 and p2 are removed
*
* After removal, the extreme values left, right, top and bottom
* are updated using the extremes method; then using an assert the
* extremes of the Cloud are checked using the extremes of the two
* Points p1, and p2
*
*/
public void crop(Point p1, Point p2){
if(p1 == p2){
Point temp = p1;
points.clear();
points.add(temp);
}
if(p1.getX() == p2.getX()){
double temp = p1.getX();
for(int i=0; i<points.size(); i++){
if(points.get(i).getX() != temp){
points.remove(i);
}
}
}
if(p1.getY() == p2.getY()){
double temp = p1.getY();
for(int i=0; i<points.size(); i++){
if(points.get(i).getY() != temp){
points.remove(i);
}
}
}
else{
double tempLeft = p1.getX();
double tempRight = p1.getX();
double tempTop = p1.getY();
double tempBottom = p1.getY();
if(p2.getX() < tempLeft){
tempLeft = p2.getX();
}
if(p2.getX() > tempRight){
tempRight = p2.getX();
}
if(p2.getY() > tempTop){
tempTop = p2.getY();
}
if(p2.getY() < tempBottom){
tempBottom = p2.getY();
}
for(int i=0; i<points.size(); i++){
if(points.get(i).getX() < tempLeft){
points.remove(i);
}
if(points.get(i).getX() > tempRight){
points.remove(i);
}
if(points.get(i).getY() < tempBottom){
points.remove(i);
}
if(points.get(i).getY() > tempTop){
points.remove(i);
}
}
}
}
/*
* equality check for doubles
*/
private boolean dblEq(double a, double b){
return Math.abs(a-b) < epsilon;
}
/**
* @param args: not used
*/
public static void main(String[] args) {
// TODO test all cloud methods
Cloud set = new Cloud();
System.out.println("initial set: " + set);
for(int i=0; i<5; i++)
for (int j=0; j<i; j++){
set.addPoint(new Point(i-j*0.5,j));
}
System.out.println("set after addPoints: " + set);
double[] ext = set.getExtremes();
if(ext != null) {
System.out.println("extremes: " + Arrays.toString(ext));
System.out.println("left of set: " + ext[0]);
System.out.println("right of set: " + ext[1]);
System.out.println("top of set: " + ext[2]);
System.out.println("bottom of set: " + ext[3]);
set.crop(new Point(3,0), new Point(2,2));
System.out.println("set after crop 1: " + set);
assert set.dblEq(set.left,2.0) && set.dblEq(set.right,3.0) &&
set.dblEq(set.bottom,0.0) && set.dblEq(set.top,2.0);
set.crop(new Point(3,2),new Point(2,2));
System.out.println("set after crop 2: " + set);
assert set.dblEq(set.left,2.0) && set.dblEq(set.right,3.0) &&
set.dblEq(set.bottom,2.0) && set.dblEq(set.top,2.0);
}
}
}
是这里的正确值是输出:我的程序没有分析正确
initial set: []
set after addPoints: [(1.0,0.0), (2.0,0.0), (1.5,1.0), (3.0,0.0), (2.5,1.0), (2.0,2.0), (4.0,0.0), (3.5,1.0), (3.0,2.0), (2.5,3.0)]
extremes: [0.0, 4.0, 2.0, 0.0]
left of set: 0.0
right of set: 4.0
top of set: 2.0
bottom of set: 0.0
set after crop 1: [(2.0,0.0), (3.0,0.0), (2.5,1.0), (2.0,2.0), (3.5,1.0), (3.0,2.0)]
set after crop 2: [(3.0,0.0), (2.0,2.0), (3.0,2.0)]
正如你所看到的极端不正确(该集合的顶部应该是3.0),以及它不裁剪正确的值ether。我做错了什么?
编辑: 好吧,基本上我的程序是假设给“云”添加“点数”(两个双精度值),并设置极值(距离云底最远和最远的距离,这是一个图),然后通过并裁剪(设置两个点并去掉所有不在由给定两点绘制的正方形中的点)。我希望这有帮助。
在你的加点中,你首先计算极值,然后加上这个点,所以你的最后一点不在这个极端。
public boolean addPoint(Point p){ extremes(); return points.add(p); }
b.t.w为什么你不检查增加点的极端而不是在整个集合上运行它。 唯一的变化可能是由于最后一点的增加。 你建立在O云(N^2),而不是为O(n)
罗尼
你是什么意思,“你在O(n^2)而不是O(n)中构建云?” – adammenges 2010-09-28 15:06:45
如果你有10分的例子,那么对于每一个添加你称为迄今所有点的极端和极端运行,所以你有1 + 2 + 3 + .. 10 = 55,而如果你只检查最后那么你有1, 1,1,1,1,1..1,1 = 10。如果你有1000点,那么如果你只检查最后一个点,那么动作次数的差异是550,000到1000。这是性能上的主要区别。这些是针对平方数行动的复杂线性行为数。 – roni 2010-09-29 19:45:26
而是要求我们解析和读取的代码找出你的程序是应该做的,也许你在把所有的代码扔给我们之前,能否描述你的问题? – zigdon 2010-09-27 21:09:42
已编辑。我希望有所帮助。 – adammenges 2010-09-27 21:16:25