给定元组坐标列表,找到与指定坐标最近的坐标

时间:2014-03-14 08:39:24

标签: python

最有效的方法是什么?我目前的实施非常混乱:

def distanceTo(self, start, end):
    """Distance from cell A to cell B. Look at me, using PYTHAGORUS like a real man."""
    startx, starty = start
    endx, endy =  end
    return math.sqrt(math.pow(math.fabs(endx - startx), 2)
                     + math.pow(math.fabs(endy - starty), 2))


def findNearestBuildings(self, myCoords, buildingGroup):
    """Returns a list of buildings specified, in ascending order of distance"""
    if len(buildingGroup.sprites()) == 0:
        return None
    buildings = []
    distances = []
    for building in buildingGroup.sprites():
        distance = self.distanceTo(myCoords, building.coords)
        for i in range(len(buildings)):
            if distances[i] < distance:
                if i == len(buildings):
                    buildings.append(building)
                    distances.append(distance)
            elif distances[i] >= distance:
                buildings.insert(i, building)
                distances.insert(i, distance)
        if len(buildings) == 0:
            buildings.append(building)
            distances.append(distance)
    return buildings

什么是更有效的方法呢?我正在使用PyGame,但这应该是一个相当普遍适用的问题。所有坐标都是整数值。

3 个答案:

答案 0 :(得分:2)

找到所有建筑物的距离(N)。 排序距离(Nln(N))。

这是最快的方法。

答案 1 :(得分:2)

您可以申请一些常见提示:

  • 如果您的列表发展缓慢,您可以缓存distance函数(例如,使用装饰器或手动使用dict),请参阅Here for examples and links

  • 使用另一个规范(distance)可能会更快地使用max.fabs(x-x0),math.fabs(y-y0))函数:这会阻止缓慢的sqrt

  • 您的平方值,无需使用fabs

  • 您可以使用已排序的原语使您的功能易于阅读(除非我误解了它正在做什么)

示例:

def findNearestBuildings(self, myCoords, buildingGroup):
      return sorted(buildingGroup.sprites(),key= lambda x:self.distance(x,myCoords))

答案 2 :(得分:2)

不要打扰平方根!它在电脑上是低调的。如果一个建筑物比另一个建筑物更近,它们之间的距离的平方也将小于到其他建筑物的距离的平方。

我的意思是,如果最近的建筑物距离10米,而下一个最近的两座建筑物距离11米和12米,那么您可以轻松地比较100(10 ^ 2)并说它小于121( 11 ^ 2)和144(12 ^ 2) - 自

以来总是如此
if a < b then a^2 < b^2  (for all positive a and b)

基本上,我的意思是这样做

return (endx - startx)*(endx-startx) + (endy - starty)*(endy - starty)