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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值