一尘不染

查找大型集合中相距最远的球体的高效算法

algorithm

我收集了10000-100000个球体,我需要找到相距最远的球体。

一种简单的方法是简单地将所有球体相互比较并存储最大距离,但这感觉就像是算法的真正资源消耗。

球体通过以下方式存储:

Sphere (float x, float y, float z, float radius);

方法Sphere :: distanceTo(Sphere&s)返回两个球的中心点之间的距离。

例:

Sphere *spheres;
float biggestDistance;

for (int i = 0; i < nOfSpheres; i++) {
    for (int j = 0; j < nOfSpheres; j++) {
        if (spheres[i].distanceTo(spheres[j]) > biggestDistance) {
            biggestDistance = spheres[i].distanceTo(spheres[j]) > biggestDistance;
        }
    }
}

我正在寻找的是一种算法,该算法会以某种更智能的方式循环遍历所有可能的组合(如果有)。

该项目是用C 编写的(必须使用C 编写),因此, 适用于C / C ++以外的语言的任何解决方案都不会引起人们的兴趣。


阅读 339

收藏
2020-07-28

共1个答案

一尘不染

一组点中任意两个点之间的最大距离S称为
直径
。在计算几何中,找到一组点的直径是一个众所周知的问题。通常,这里有两个步骤:

  1. 找到由每个球体的中心组成的三维凸包-使用 quickhull CGAL中的实现。

  2. 找到船体上最远的点。(在船体内部的两个点不能是直径的一部分,否则它们将在船体上,这是矛盾的。)

使用quickhull,您可以在平均情况下运行O(n log n),在最坏情况下运行时间为O(n
2)。(在实践中,quickhull明显优于所有其他已知算法。)如果可以保证球序的某些属性,则可以保证更好的最坏情况下的边界,但这是不同的话题。

第二步可以通过Ω(h log h)进行,其中h是船体上的点数。在最坏的情况下h = n(每个点都在船体上),但是如果您有成千上万个随机球体,那几乎是不可能的。一般而言,h将小于n。这
是此方法的概述。

2020-07-28