最有效的方法是什么?我目前的实施非常混乱:
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,但这应该是一个相当普遍适用的问题。所有坐标都是整数值。
答案 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)