优化对最近的公交车站的搜索

时间:2017-11-06 10:46:05

标签: java optimization data-structures binary-search-tree latitude-longitude

我想知道是否有一个更好的方法,给定一个latitute和经度,找到最近的公交车站,而不是通过完整的ArrayList:

那就是BusStation Class:

    while(iteratore.hasNext()){    // for the full array size...
        tmp = (BusStation) iteratore.next();
        tmpDistance = getDistance(currentLat, currentLong, tmp.getStopLat(), tmp.getStopLon());
        if(tmpDistance < nearestDistance){  // if the distance is smaller ...
            nearestStop = tmp;  // i save the bus stop
            nearestDistance = tmpDistance;  // i save the distance too
        }
    }

效率不高的代码 工作 ,但每次调用该方法时都必须< strong> 查看 带有n。

复合体的完整数组

我们如何使用 数据结构 作为 二进制搜索树 来优化它?

方法的签名应如下所示:

public BusStation search(double currentLat, double currentLong){}

1 个答案:

答案 0 :(得分:1)

您的核心算法与您可以做的一样好。但是,您可以通过首先根据位置将它们分类到存储桶中来减少必须检查的项目数。例如,你可以为每1平方公里的地图设一个水桶。

如果您知道地图上的每个点都有1公里内的公交车站,那么您只需要搜索目标1公里广场及其8个邻居的站点 - 因为在1公里半径范围内绘制了一个半径的圆圈。中心广场将完全包含在这9个广场中。

在许多现实世界的情况下,根据你如何知道止损的传播,你可以想出一个便宜的方法来选择一小组保证包含你正在寻找的止损的方块。它可能非常简单(“地图上的任何地方距离停靠点不超过1公里,因此围绕坐标的3x3广场将包含一个”)或更多技术(“在城市中心,3x3搜索保证命中;在郊区,我需要5x5“)

如果算法需要更一般,那么你可以先搜索那9个方块,然后加上重叠一个更大圆圈的方块。

radius = 1
while(true) {
    Set<Square> squares = difference(
         squaresContainedIn(radius), 
         squaresContainedIn(radius - 1));
    busStop = findNearest(coords, squares);
    if(busStop != null) {
        return busStop;
    }
    radius ++;
}

要小心;你必须稍微改进这个算法。即使距离一平方的候选人,最近的项目也可能是两个方格:

a 33333
b 32223
c 32123
d 32223
e 33333

  ABCDE

尽管在E,c(第一个“搜索范围”)的远角处有一个项目,但最近的笛卡尔距离可能在B,d(第二个“搜索范围”)。有多种方法可以让算法处理这个:

  1. 检查波段时,忽略不在当前半径范围内。在考虑radius的下一次迭代时,您需要再次查看这些方块。
  2. 或者,当您找到候选人时,在您搜索下一个乐队之前,不要将其视为“最终”项目。
  3. 或者,根据实际需求,您可能会认为偶然错误(但仍然有用)的答案是速度可接受的权衡。

    如果您想扩展此方法,可以使用QuadTree结构,其中方块嵌套在较大的方块中。