Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 优化搜索给定区域中的二维点(webservice)_Java_Algorithm_Sorting_Search_Collections - Fatal编程技术网

Java 优化搜索给定区域中的二维点(webservice)

Java 优化搜索给定区域中的二维点(webservice),java,algorithm,sorting,search,collections,Java,Algorithm,Sorting,Search,Collections,我有一种算法和性能问题需要用Java来解决。我收集了大量二维点(假设有大约100000个)。我想在搜索点SP(X_SP,Y_SP)周围的给定区域中获得一组点,以便获得满足条件的点P(X Y): x在x_sp-constValue和x_sp+constValue之间,y在y_sp-constValue和y_sp+constValue之间 为了让您了解数字关系,constValue将类似于2、5或10,x、y的范围将在0到1000之间。这意味着它是一个Web服务,因此必须考虑同时搜索多个不同点的可能

我有一种算法和性能问题需要用Java来解决。我收集了大量二维点(假设有大约100000个)。我想在搜索点SP(X_SP,Y_SP)周围的给定区域中获得一组点,以便获得满足条件的点P(X Y):

x在x_sp-constValue和x_sp+constValue之间,y在y_sp-constValue和y_sp+constValue之间

为了让您了解数字关系,constValue将类似于2、5或10,x、y的范围将在0到1000之间。这意味着它是一个Web服务,因此必须考虑同时搜索多个不同点的可能性

由于这些是固定点(不会因计算或其他原因而改变),我认为最好提供一个按X排序的对象列表和另一个按Y排序的对象列表。然后,我将首先获取X范围内的点,并使用引用从另一个列表(按Y排序)获取该点集。然后,我将通过Y缩小选择范围,最终得到给定区域中的点

我不完全了解Java,所以我想向您咨询最优化的方法。我应该使用哪些对象来存储排序点,以便快速搜索范围内的对象?或者我必须为这个任务实现我的自定义算法?另外,当涉及到在数据库中存储点时,SQL查询是否足够快以交付结果?或者NoSQL dbs更适合于此


我将自己进行测试,但我正在寻找一个开始的候选者。

我可能会使用
TreeMap
,其中地图的关键是
x
坐标,对于每个
x
坐标,您都有一个
y
坐标列表。然后,您可以使用和查找位于您的范围内的
x
坐标。然后,对于您获得的每个
TreeSet
集,您可以使用和来获得适当的条目

当然,这只会给出框的边界坐标(四个角)。但是
TreeSet
也有一个可以为您提供一系列值的函数。你将不得不使用这两次;对于边界内的
x
坐标列表(您可以使用地图的
keySet
方法获取密钥集),然后对于每个
x
坐标,选择边界内的
y
坐标。所以伪代码应该是这样的:

List<Point> result = new ArrayList<>();
int lowerX = points.ceilingKey(x - c);
int upperX = points.floorKey(x + c);
for each x coordinate in points.entrySet().subset(lowerX, upperX)
    TreeSet<Integer> yCoordinates = points.get(x);
    lowerY = yCoordinates.ceiling(y - c);
    upperY = yCoordinates.ceiling(y + c);

    for each y coordinate in yCoordinates.subset(lowerY, upperY)
       result.add(new Point(x, y))
List result=new ArrayList();
int lowerX=点。天花板键(x-c);
int upperX=点地板(x+c);
对于points.entrySet()子集(lowerX,upperX)中的每个x坐标
树集Y坐标=点。获取(x);
lowerY=y坐标。天花板(y-c);
上部y=y坐标。天花板(y+c);
对于yCoordinates.子集(lowerY,upperY)中的每个y坐标
结果。添加(新点(x,y))
我还没有测试出来,所以可能有一些bug或者我遗漏了什么。让我知道,我会更正答案

floor
天花
调用是
log(n)
我相信——这就是您获得性能优势的地方,因为如果您使用一个列表,查找它将是
O(n)


注意:我不知道这是否是最有效的。因此,通常不适合提出这样一个开放式问题,因此你可能会在其他地方获得更多的运气。

这太宽泛了。除非你有一个关于试图解决这个问题的具体问题,否则这个问题不适合这样做。这不是一个免费的编码服务。你所拥有的只是一个问题陈述。首先找到一个优化的算法来完成任务,然后如果你需要帮助优化你的代码,请联系这里。然而,你应该看看