提前为文字墙道歉——我已经有一段时间没有完成编程了,可能有更好的术语来表达我的意思。搜索了我能想到的所有内容,但没有在网站上找到任何相关问题,但也许我们可以找到更好的条款,因此我们将不胜感激任何帮助!
我正在尝试提高查找相隔不超过一组出租车/曼哈顿距离的对象组的性能。 所以,假设我的距离是“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,但算法比特定类型和库更重要(尽管我也会接受这些!)。