Performance 找到最近移动点的最有效方法是什么;敌人;?

Performance 找到最近移动点的最有效方法是什么;敌人;?,performance,search,closest,Performance,Search,Closest,我见过一些类似的问题,但他们更关注于比较两种不同的方法,而不是从更一般的意义上提问 但是,当“敌人”和当前玩家/NPC都可以自由移动时,找到最近的“敌人”的最有效方法是什么 如果敌人的位置是静态的,我想确定最近位置的最有效方法是根据他们的位置排序列表,然后使用二进制搜索算法找到最近的位置。然而,由于他们正在四处移动,我能想到的唯一解决方案是一个简单的for循环,它迭代每个敌人,并将距离与最近的距离进行比较,运行时为O(n) 这并不理想,尤其是当两个团队中都有多个实体时。假设团队A中有100个实体

我见过一些类似的问题,但他们更关注于比较两种不同的方法,而不是从更一般的意义上提问

但是,当“敌人”和当前玩家/NPC都可以自由移动时,找到最近的“敌人”的最有效方法是什么

如果敌人的位置是静态的,我想确定最近位置的最有效方法是根据他们的位置排序列表,然后使用二进制搜索算法找到最近的位置。然而,由于他们正在四处移动,我能想到的唯一解决方案是一个简单的for循环,它迭代每个敌人,并将距离与最近的距离进行比较,运行时为O(n)

这并不理想,尤其是当两个团队中都有多个实体时。假设团队A中有100个实体,团队B中有100个实体。所有实体都不是用户控制的。这意味着团队A上的每个实体将每隔x秒迭代团队B上的所有实体,反之亦然。那就是每x秒进行20000次比较(如果我算对了的话)

我没有任何代码可以共享,因为这是一个更一般的问题,但几年前我做了一个非常简单的游戏时,我确实使用了for-loop方法,它对少数实体运行良好,但我相信我注意到了大约30-40个实体的性能问题


感谢您的帮助

您试图解决的问题看起来像是最近邻搜索或n体模拟

如果你考虑一个问题,你需要在n个元素列表中找到最接近的元素,那么你需要遍历所有元素。因此,产生的复杂性是

O(n)
。您不能做得更好,因为您需要读取整个输入(n个元素)

如果您想在给定元素列表中找到<强> >每个< /强>元素中最接近的元素,那么您可以比测试所有可能的距离(以<代码> O(n ^ 2)的复杂性)更快地实现这一点。解决此问题的常用方法是将所有元素放在数据结构中(例如或)。这样的数据结构可以帮助您在

O(log(n))
时间内找到距离某个位置最近的元素。因此,此方法的总体复杂性为
O(nlog(n))

请注意,更新BSP树中元素的位置最多需要
O(log(n))
操作。因此,更新n个元素的计算时间为
O(nlog(n))
时间。这比简单地更新n个元素的位置(in
O(n)
要贵一些,但仍然相对便宜