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

标签 javascript arrays algorithm

我在 Javascript 工作。我有一个在 3d 空间中包含点的数组,我希望这些点不要非常靠近数组中的其他点。我的意思是,我希望点之间的距离大于 x。现在我正在做的是有一个 double for 循环比较距离和移动 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;      
            }
        }
     }
}

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

最佳答案

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

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

对于静态点(那些不移动的点),制作一棵树很简单,您只需遍历几个父节点并检查其子节点(距离越近的子节点越近)。这也称为 R 树,还存在其他选项。

这也适用于 3D。

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

从视觉上您可以看到它变得更加简单,您只需选中您半径范围内的框,这样您最终可以少做很多工作。

对于动态点(那些移动的点),保持如此详细的 R 树存在可能是不可行的。因此,我们将不得不降低细节级别,并在您的方法和 R 树之间寻找一些东西,例如,只制作稍微大一点的盒子就是一种方法。

其他方法涉及使用四边形(每次将一个立方体分成 4 个较小的立方体,前提是它包含一个点)和网格(您创建许多大小相同的立方体)。您可以阅读更多关于 R 树和其他结构的信息 here , 它很好地介绍了它们。

例如,它的一个衍生物是将地球分成三 Angular 形的测地线网格,尽管这可能不适用于 3D(除非您将三 Angular 形与地球中间的顶点连接)。

图片来自维基百科。

关于javascript - 在数组中查找具有相似值的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13463381/

相关文章:

javascript - 在 ReactJS 中使用服务器端 HTML 模板

javascript - 使用 JavaScript 在有序列表中插入列表项

java - 如何检查计数器是否越界

javascript - 移动数组后 p5 对象呈现奇怪的效果

algorithm - 多 TSP 有一个转折

javascript - HackerRank 上的配对算法

javascript - 锁定 Javascript 函数

arrays - 数组不一致

java - 如何在 Java 中组合两个列表

javascript - 如果我们单击页面上的任何位置,气泡应该关闭