2

提前为文字墙道歉——我已经有一段时间没有完成编程了,可能有更好的术语来表达我的意思。搜索了我能想到的所有内容,但没有在网站上找到任何相关问题,但也许我们可以找到更好的条款,因此我们将不胜感激任何帮助!

我正在尝试提高查找相隔不超过一组出租车/曼哈顿距离的对象组的性能。 所以,假设我的距离是“x”,点“a”是距离点“b”的 x 个单位,点“b”是距离“c”的 x 个单位,点“c”是距离点“a”的 x+3 个单位; 我应该将 a、b 和 c 标识为一个组,以及其中任何一个 x 单位内的任何对象(等等)。

我已经确定了几种用于查找这些组的简单算法,但我认为性能可以更好。聚类算法似乎在这里应该是相关的,但我一直无法找到适合我的问题的算法。我也不确定我是否尽可能有效地存储数据——现在我只是在处理静态数据,所以我可以在开始之前将它复制成我需要的任何形式;但是在未来,我希望有一个可以有效地处理添加和删除点的实现。以下是详细信息:

  • 我从两个无序的 ArrayLists 对象开始,它们的许多属性中有一个唯一的整数坐标三元组 (x,y,z)。
  • 物体稀疏地分散在一个非常大的体积上(比如 5 亿立方单位),我设定的距离相对较小(<15 个单位)
  • 我不需要找到大小为 1 的组,因此有很多“噪音”。在我的数据中,超过三个的组非常罕见。
  • 超过 90% 的时间附近的对象是在相似的时间添加到 ArrayLists 中的,所以如果可以的话,我想利用这个事实。
  • 另一个有用的事实是,一个维度 (y) 的范围大约是其他两个维度的 1/10,因此二维算法可能是一种更快的开始方式,如有必要,稍后会拆分二维组。
  • 找到这些组后,我需要访问组中的每个对象以进行函数调用,因此我需要识别对象,而不仅仅是坐标。

如何改进仅使用偏移网格循环遍历 ArrayLists 两次然后重新分析我创建的组的性能? 我的语言是 Java,但算法比特定类型和库更重要(尽管我也会接受这些!)。

4

1 回答 1

1

我认为您正在尝试实现Range search的特殊情况。也许将您的数据存储在kd 树中会很有用。至少,您应该能够轻松地提取位于围绕您正在搜索的点之一的超立方体中的点。然后您可以检查它们的距离是否符合要求。

另请参阅:“ Fixed-Radius Near Neighbors and Geometric Basics ”了解一些解决方案。

于 2013-01-27T23:19:48.273 回答