在大而稀疏的嘈杂体积中找到位置紧密的点

时间:2013-01-27 23:06:09

标签: java distance

对于文本墙提前抱歉 - 自从我完成编程以来已经有一段时间了,我的意思可能就是更好的术语。搜索了我能想到的一切,但没有在网站上找到任何相关的问题,但也许我们可以找到一个更好的术语,所以任何帮助都将不胜感激!

我正在尝试提高查找不超过集合taxicab/Manhattan distance的对象组的效果。所以,我的距离是'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,因此二维算法可能是一种更快的启动方式,如果需要,可以在以后拆分二维组。 / LI>
  • 一旦找到这些组,我需要访问组中的每个对象以进行函数调用,因此我需要识别对象,而不仅仅是坐标。

如何通过偏移网格两次循环遍历ArrayLists然后重新分析我创建的组来提高性能?我的语言是Java,但算法比特定类型更重要和图书馆(虽然我也会拿这些!)。

1 个答案:

答案 0 :(得分:1)

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

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