问题陈述:
在三维空间中有超过十亿个点。目标是找到距离小于给定距离 R 的最多邻居点数的前 N 个点。另一个条件是这些前 N 个点之间的距离必须大于 R。这些点的分布不均匀,很常见某些区域包含了大量的点。
目标:
找到一种算法,该算法能够适应许多处理器并且内存需求小。
想法:
由于分布不均匀,通常的空间分解对于这种问题来说是不足够的。采用不规则的空间分解可以将点的数量均匀地分配,从而有助于解决该问题。如果有人能够为我们提供一些解决方案,我将非常感激。
问题陈述:
在三维空间中有超过十亿个点。目标是找到距离小于给定距离 R 的最多邻居点数的前 N 个点。另一个条件是这些前 N 个点之间的距离必须大于 R。这些点的分布不均匀,很常见某些区域包含了大量的点。
目标:
找到一种算法,该算法能够适应许多处理器并且内存需求小。
想法:
由于分布不均匀,通常的空间分解对于这种问题来说是不足够的。采用不规则的空间分解可以将点的数量均匀地分配,从而有助于解决该问题。如果有人能够为我们提供一些解决方案,我将非常感激。
https://en.wikipedia.org/wiki/Octree
另外,您可以尝试构建R树。但是,R树会尝试平衡,使得查找最密集区域更加困难。对于您的特定任务,Octree的这个缺点实际上很有帮助! R树花费了很多精力来保持树的深度均匀,以便每个点可以在大致相同的时间内找到。然而,您只对密集区域感兴趣,这些区域将在Octree中最长的路径上找到,甚至不必查看实际点!
3) 在2^(3*8)个盒子中心上进行K-means聚类。(谷歌并行"k means"-> 121k hits。) 这在很大程度上取决于K,也就是Ncluster,以及你的半径R。一个粗略的方法是使用最多点的27 * Ncluster个盒子构建一个堆,然后根据你的半径约束选择最大的盒子。(我喜欢从最小生成树开始, 然后删除最长的K-1条链接来得到K个簇。) 参见颜色量化。
我会从一开始就将Nbit(这里为8)作为参数。
你的Ncluster是多少?
补充:如果你的点随时间移动,请参考SO上的大量圆形的碰撞检测。
R
为定义,那么对于给定的点集分成的桶,满足您条件的点很可能存在于最满的桶中。一个想法。根据给定的点和距离小于R的边创建图。
这种图的创建类似于空间分解。您的问题可以通过图中的本地搜索来回答。首先是具有最大度数的顶点,其次是查找最大不相连的最大度数顶点集。
我认为可以并行创建图形和搜索。这种方法可能需要大量的内存。拆分域并使用较小体积的图可以减少内存需求。