我正在写一个小游戏,其中许多(订购1000-10000)汽车在你周围驾驶,需要顺利地互相躲避。它们的位置可以用它们的2D XY坐标表示。
每一个车架,每辆车都需要确保它不会撞到另一个车架,天真地实施它将是一个O(N ^ 2)算法。我可以采用哪种最佳的2D加速结构来提高效率?
添加更多上下文:
答案 0 :(得分:0)
所以,你要检查是否有碰撞。如果我理解你的例子就会发生碰撞,那么在汽车移动后,必须在同一地点停放两辆汽车。
我认为我们可以在这里使用spot或position的概念。您可以保存在给定时间在一组中的汽车的位置(矩阵的坐标,或任何最适合您的问题)。当汽车移动时,从集合中删除它的位置并将其新的插入到集合中。
一旦我们确定了这一点,您只需检查该集合是否包含汽车的下一个位置,以确定是否会发生碰撞,并且在HashSet咨询中O(1)。将其应用于您的车辆数量(n),您将在O(n)中进行碰撞管理。
进一步说明的示例:
你在" O"和#34; X" s上有汽车的这个位置矩阵。这意味着如果您从左上角开始编号,那么您将在第1位置设一辆车,在第8位开启另一辆车。
O X X
X X X
X O X
这意味着您拥有一组位置为1和8的整数。现在,移动其中一辆车的例子:
位置1上的轿厢移动到位置2:检查位置2是否在集合[O(1)]中。它不是。从集合[O(1)]中删除位置1并将位置2添加到集合[O(1)]中,因为现在位置1上没有汽车但位置2没有。
对每辆车重复(n)=> O(1)* O(n)= O(n)。
答案 1 :(得分:0)
您可以使用类似quadtree的内容。四叉树是具有O(log n)更新(插入/移除)时间的2D索引方案。
最简单的可能性是为每辆车存储矩形(轴对齐的边界框)。然后,每次在将汽车重新插入其新位置之前,在新位置执行窗口查询(查询矩形)以查看它是否与任何其他汽车重叠。如果你有树的源代码,你甚至可以实现一个组合操作updateAnCheck(),它可以在一次调用中检测碰撞和更新。 (我假设结构经常更新,新旧位置重叠,以便或多或少地可靠地检测到碰撞,如果足够快,其他智能车可以相互传送。)<。 / p>
复杂性:
总计算复杂度:检测n car的所有碰撞:O(n * 2 * log n)= O(n log n) 总空间复杂度:约O(n * log n)
有四种可用的四叉树开源实现,如果您使用的是Java,可能需要查看mine。