assas

package com.jleo.pickitup;

import org.apache.commons.collections.list.TreeList;

import java.math.BigDecimal;
import java.util.*;

public class Norm{
	public static double normrnd(double mu, double sigma) {
		double N = 12;
		double x = 0, temp = N;
		do {
			x = 0;
			for (int i = 0; i < N; i++)
				x = x + (Math.random());
			x = (x - temp / 2) / (Math.sqrt(temp / 12));
			x = mu + x * Math.sqrt(sigma);
		} while (x <= 0);
		return x;
	}

	public static double[] addInv(double[] r) {
		double[] result = new double[r.length * 2];
		for (int i = 0; i < result.length; i += 2) {
			result[i] = r[i / 2];
			result[i + 1] = -r[i / 2];
		}
		return result;
	}

	public static double[] normrnd(double sigma, int num) {
		double[] r = new double[num];
		for (int i = 0; i < num; i++) {
			r[i] = normrnd(0, sigma);
		}
		return addInv(r);
	}

	public static Point[] generateMap(int x1, int x2, int y1, int y2, int numberOfDots,int numberOfBlock) {

		double mu = 3;
		double sigma = 1;

		int[] x = new int[numberOfDots];
		int[] y = new int[numberOfDots];
        int xDevideBy = (x2 - x1)/numberOfBlock;
        int yDevideBy = (y2 - y1)/numberOfBlock;

		Point[] points = new Point[numberOfDots];
		for (int i = 0; i < numberOfDots; i++) {
			x[i] = (int) ((normrnd(mu, sigma)-3)*((x2-x1)/6)+(x1+x2)/2);
			y[i] = (int) ((normrnd(mu, sigma)-3)*((y2-y1)/6)+(y1+y2)/2);
			points[i] = new Point(x[i], y[i], (x[i]-x1)/xDevideBy,(y[i]-y1)/yDevideBy);
		}
		return points;
	}

    public static String[] getNeighbours(String zoneId){
        int zonex = Integer.valueOf(zoneId.split(",")[0]);
        int zoney = Integer.valueOf(zoneId.split(",")[1]);

        String[] neighbours = new String[9];
        int idx = 0;
        for(int x= zonex-1;x<=zonex+1;x++){
           for(int y= zoney-1;y<=zoney+1;y++){
                neighbours[idx] = x+","+y;
                idx++;
            }
        }
        return neighbours;
    }

	public static void main(String[] args) {
        int x1 = 31095278;
        int x2 = 31334871;
        int y1 = 121256104;
        int y2 = 121629639;
        int numberOfDots = 50000000;
        int numberOfBlock = 150;
        Point[] points = Norm.generateMap(x1, x2, y1, y2, numberOfDots, numberOfBlock);
        Map<String, List<Point>> blockMap = new HashMap<String, List<Point>>();
        for(int i=0; i<points.length; i++){
            Point p = points[i];
            String zoneId = p.zonex+","+p.zoney;

            if(!blockMap.containsKey(zoneId)){
                List<Point> ps = new ArrayList<Point>();
                ps.add(p);
                blockMap.put(zoneId,ps);
            } else{
                blockMap.get(zoneId).add(p);
            }
        }
        long t1 = System.currentTimeMillis();
        String zoneid = points[1245].zonex + "," + points[1245].zoney;

        String[] neighbours = getNeighbours(zoneid);
        List<Point> pointsInNeighbours = new ArrayList<Point>();
        for(int i=0;i<neighbours.length; i++){
             if(blockMap.containsKey(neighbours[i]))
                 pointsInNeighbours.addAll(blockMap.get(neighbours[i]));
        }
        TreeMap tm = new TreeMap();
        for(int i=0; i<pointsInNeighbours.size(); i++){
            if(pointsInNeighbours.get(i) == points[1245])
                continue;

            tm.put(points[1245].distanceTo(pointsInNeighbours.get(i)), pointsInNeighbours.get(i));

        }
        long t2 = System.currentTimeMillis();
        System.out.println(t2-t1);
        System.out.println(tm.firstKey());

         long t3 = System.currentTimeMillis();
        tm = new TreeMap();
        for(int i=0; i<points.length; i++){
            if(points[i] == points[1245])
                continue;

            tm.put(points[1245].distanceTo(points[i]), points[i]);

        }

        long t4 = System.currentTimeMillis();
        System.out.println(t4-t3);
        System.out.println(tm.firstKey());
	}
}
aas

你可能感兴趣的:(apache)