【发布时间】:2010-02-16 21:28:12
【问题描述】:
我收集了 10000 - 100000 个球体,我需要找到相距最远的球体。
一种简单的方法是简单地将所有球体相互比较并存储最大距离,但这感觉就像算法的真正资源消耗。
Spheres 的存储方式如下:
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++ 以外的其他语言中工作的任何解决方案都不太受关注。
【问题讨论】:
-
澄清一下,你想要比 O(n^2) 更好的东西(这很糟糕)。嗯.....
-
distanceTo() 是否服从三角不等式? distanceTo() 是中心到中心还是表面到表面?球体在向量空间中有坐标吗?它是在欧几里得空间中,还是在弯曲度量的周围有黑洞?无论如何,你从哪里得到所有这些球体?球内有什么有趣的东西可以在 eBay 上出售,因为你似乎有很多?
-
@Craig 如果他们在真正的线上,那么排序将是 n log(n),但只有 O(n) 才能找到最小和最大坐标。假设半径或表面不是问题
-
BFS 搜索提供 O(b^d) 复杂度或 O(|E| + |V|)
-
@Mark:是的,这是作业。你是怎么猜到的? (除了 CS 老师喜欢大量失控的数据这一事实之外。)@Craig:是的,我知道可以进行一些改进 - 但我有一种感觉,我错过了一些东西。 =P @Paul:大声笑,我认为球体的内部充满了空隙。如果你想买一些,我相信我们可以安排一些东西。 ;-)
标签: algorithm collections geometry comparison