查找数组中具有相似值的数字

时间:2012-11-19 22:23:30

标签: javascript arrays algorithm

我在Javascript工作。我有一个在3d空间中有点的数组,我希望这些点不要非常接近数组中的其他点。我的意思是,我希望点之间的距离大于x。现在我正在做的是有一个双循环比较距离和移动 这些点在Z维度上更远,如

while(there_are_objects_that_are_close){
    for(all_the_objects){
        for (all_the_objects){
            if (distance_between_them < 100){
                object[i].z += 150;      
            }
        }
     }
}

问题是我讨厌这个算法,看起来很慢,我正在寻找更好的解决方案。如果您的解决方案也是具有文学背景的“具有名称的算法”,我会更加欣赏它,因为这是我们学校项目的一部分。

2 个答案:

答案 0 :(得分:4)

将每个点与每个点进行比较确实是最简单的,因此您的算法是一个良好的开端。

这样做的缺点是,当点数量变得很大时,算法将开始表现得相当糟糕,因为它必须将每个点与所有点进行比较,而大多数点都不接近。在这种情况下,您可能希望以这样的方式分割点,即只检查可能足够接近的点。

对于静态点(不移动的那些),制作一棵树是非常简单的,只需要走几个父节点并检查它的子节点(距离较近的子节点距离较近)。这也称为R树,也存在其他选项。

这也适用于3D。

两张图片均来自维基百科。

从视觉上来说,你可以看到它变得简单得多,你只需要检查你方圆范围内的方框,你最终会以这种方式减少工作量。

对于动态点(移动点),保持这样详细的R树存在可能是不可行的。因此,我们必须降低细节水平,在你的方法和R树之间寻找一些东西,只需要做一些稍大的盒子,例如一种方法。

其他方法涉及使用四边形(每次将一个立方体划分为4个较小的立方体,只有它包含一个点)和一个网格(您创建了大量相同大小的立方体)。您可以阅读有关R树和其他结构here的更多信息,它可以作为对它们的介绍。

这种衍生物例如是将球体划分为三角形的测地网格,尽管这可能不适用于3D(除非您将三角形与地球中间的顶点连接起来)。

图片来自维基百科。

答案 1 :(得分:0)

需要找到一种方法将点分成较小的区域进行比较。

由于你只能通过改变Z维度来移动点,我的第一个想法是按Z维度值对点进行排序,并且只比较Z维度上接近的点。但我仍然不知道如何划分区域。