我需要在三维空间中找到点云的直径(它们之间的最大距离的两个点)。作为一个临时解决方案,现在我只是迭代所有可能的对并比较它们之间的距离,这是一个非常慢的{"request":{"username":"test","password":"test"}}
解决方案。
我相信可以在O(n^2)
中完成。在2D中这是一个相当容易的任务(只需找到凸包,然后应用旋转卡尺算法),但在3D中我无法想象如何使用旋转卡尺,因为没有办法订购积分。
有没有简单的方法(或O(n log n)
或python
中的即用型实施)?
PS :StackOverflow上有类似的问题,但我发现的答案仅涉及旋转卡尺(或类似)算法,它在2D情况下工作正常,但不清楚如何实现3D(或更高维度)。
答案 0 :(得分:2)
虽然在3d中存在O(n log n)预期时间算法,但实现它们似乎很棘手(同时保持与暴力O(n ^ 2)算法竞争)。
Har-Peled 2001中描述了一种算法。作者提供的source code可以选择性地用于优化计算。我无法下载最新版本,“旧”版本可能足以满足您的需要,或者您可能希望与作者联系以获取代码。
Malandain & Boissonnat 2002和作者provide code中提供了另一种方法。尽管这个算法在更高维度上呈现为近似,但它可以满足您的目的。请注意,他们的代码提供了Har-Peled的精确计算方法的实现,您也可以检查它。
在任何情况下,在实际使用中,您应该始终检查您的算法是否与天真的O(n ^ 2)方法保持竞争力。