我试图得到一个给定半径范围内的玩家列表,并按他们到该点的距离排序。 获得玩家很简单:
players = [
player for player in Player.instances
if player.distance(my_point) <= max_radius
]
分类也很好:
return sorted(players, key=lambda player: player.get_distance(my_point))
但是,如果服务器上满是玩家,那么为每个人调用player.distance(my_point)
可能会变得很繁重,因此在之后对玩家进行排序总是需要一些额外的时间。
有没有一种方法可以在添加玩家时自动对列表进行排序,这样我就不必在每个人中循环两次并调用getdistance
两次?你知道吗
作为使用排序数据结构的替代方法(如martijnpieters所建议的),您可以将距离信息与player对象相结合。您可以通过将其作为属性添加到player类中,或者通过临时将每个player实例与其距离信息相结合来实现这一点。例如
如果这个距离确实是欧几里德空间中的距离,那么你可以使用某种空间划分算法,比如quadtree表示2D,或者octree表示3D
如果您有一个静态集,那么就不需要进行空间分区。但是如果你有一个有许多参考点的动态集合,或者玩家正在移动,那么这些方法比每次计算距离时,计算距离(
O(kn)
距离计算)然后为每个操作计算最近的距离要有效得多。你知道吗另请参见相关的C++ discussion。你知道吗
相关问题 更多 >
编程相关推荐