我在3D空间(x,y,z)中有大量的点,表示为3个浮点结构的数组。我还可以使用具有CUDA功能的强大显卡。我想要以下内容:
将数组中的点划分为群集,以便群集中的每个点与群集中的至少一个其他点的最大欧氏距离为X.
“蛮力”这样做的方法当然是计算每个点和每个其他点之间的距离,看看是否有任何距离低于阈值X,如果是,则将这些点标记为属于相同的集群。这是一个O(n²)算法。
这可以在使用n²线程的CUDA中并行完成,但是有更好的方法吗?
答案 0 :(得分:2)
使用 binning :
可以将算法简化为O(n)其他分档中的分数比X大,所以你根本不需要评估距离。
通过这种方式,假设点中的密度恒定,则必须仅为恒定数量的对点数/总点数计算距离。
将点分配给箱子也是O(n)。
如果这些点不是均匀分布的,那么这些区域可以更小(并且你必须考虑超过26个邻居来评估距离)并最终稀疏。
这是用于分子动力学,光线追踪,网格划分的典型技巧......但是我知道分子动力学模拟中的术语:可以改变名称(链接单元格,kd-tree也使用相同的原理) ,即使更加明确,算法保持不变!
而且,好消息是,该算法非常适合并行实现。
参考文献: