基于位置和半径快速查询对象

时间:2014-02-19 13:12:17

标签: algorithm data-structures large-data

我正在开发一个简单的生态系统模拟,我坚持为这些生物选择最佳的数据结构。

我基本上拥有的是当前世界中所有动物的列表,其中包含有关动物类型和位置的信息。这个列表可能会变得非常大 - 可能接近数百万。

因此,为了实现一些简单的AI,我需要尽可能快地完成这个操作: 给定地图上的一个点和半径,给我一个半径范围内所有动物的列表,按照距中心点的距离排序。

世界将是2d所以我们仅限于平面坐标。 我还需要支持的一些操作:

  • 改变动物的位置
  • 创造新动物
  • 移除动物

我读到了kd树以及他们快速计算最近邻居的能力。

问题:
你认为它适用于我的情况吗?如果没有,我应该使用什么数据结构来满足要求?

修改

以下是评论中要求的更多详细信息。 世界不会太大 - 这种东西可以适合屏幕,动物是小圆圈。我还应该支持世界变得相当密集的情景。 最后,我希望每个查询返回的数据不会超过几十个,但是因为我会有大量的查询(每个动物一个,因此应该以某种方式缓存,但是为了简单起见,让我们忘记了)这就是尽可能快速有效。

2 个答案:

答案 0 :(得分:1)

鉴于你的约束(大量的移动物体和可能固定大小的小世界),简单的grid可能比kd树更合适。

请参阅:Trees or Grids? Indexing Moving Objects in Main Memory

答案 1 :(得分:0)

如果在位置改变之前存在许多查询(例如,每只动物一个),则kd-tree应该可以正常工作。增量更新也可能没问题,但是必要时完全重建的不可变kd树的优点是树结构可以用数组简洁地表示。要查找搜索磁盘中的所有点,请在修剪半平面完全排除搜索磁盘的节点时遍历树。你必须在最后按距离对结果进行排序。