如何确定一个实体是不是适合 O(N^2) 中的给定框?

Posted

技术标签:

【中文标题】如何确定一个实体是不是适合 O(N^2) 中的给定框?【英文标题】:How to determine if a solid fits inside a given box in O(N^2)?如何确定一个实体是否适合 O(N^2) 中的给定框? 【发布时间】:2014-10-14 19:27:55 【问题描述】:

我正在寻找一种算法,它可以让我确定一个固体物体是否可以放入具有给定尺寸的盒子(矩形棱镜)内。实体可以旋转和平移以适合框内。

我已经有了解决这个问题的办法:

    计算实体的最小边界框(已知算法)。 确定最小边界框是否适合另一个框(简单)。

(编辑:这不是一个有效的解决方案)

这可行,但我正在寻找更有效的解决方案。最小边界框算法在 O(n^3) 时间内运行,其中 n 是顶点数。我希望有一个 O(n^2) 算法。

请注意,我可能会询问形成实体凸包的点集是否可以放入框内,而不是“实体对象”。

【问题讨论】:

从实际的角度来看,我们在谈论多少个顶点? 在详细对象的真实模型上可以找到的数量,因此在 100 到 10,000 之间。 好的。好吧,其中许多顶点都不相关。只有离对象中心最远的那些才是重要的(“内部”或“凹”顶点都不重要,只有凸顶点),所以我首先只搜索那些将对您的计算产生影响的顶点。换句话说,您不需要太多细节就可以查看对象是否适合。 如果剔除过程在所有情况下都能让您减少到大约 100 个相关顶点,我不会感到惊讶,这将使您现有的 O(n^3) 算法可行。 @mikebolt:是的,但是如果最小边界球适合,最小边界框也可以。只有当它不适合时,您才需要更昂贵的最小边界框计算。如果大量输入数据通过边界球计算,则可以避免对大部分输入值进行边界框计算(因此,您将在 O(N^2) 和 O(N^3) 之间的某处获得摊销性能. 【参考方案1】:

您可能想看看this paper。它提供了一种算法,而不是在 O(n log n + 1/epsilon^3) 时间内计算 3D 最小边界框的 1+epsilon 近似值。

【讨论】:

【参考方案2】:

快速排除一些对象

如果您期望答案通常为“否”,您可以(相当)快速排除许多情况,如下所示:如果有一对点之间的距离超过了您的盒子的最长对角线,那么形状不可能适合它。这是 O(n^2),但您可以在找到更远的对时立即停止,您也可以先沿最长维度对点进行排序,然后从两端取点作为对,以增加找到

结合 Eric J. 的建议,使用边界球来统治 in 中的对象,这可能会很快解决许多情况。

快速统治一些物体

您的另一个选择是随机投射点数次,然后计算 AABB;如果它适合你的盒子,你就完成了。这需要generating random unit-length vectors。

【讨论】:

【参考方案3】:

如果this 没有过时,则目前没有更快的精确算法:

目前最快的 3D 边界长方体算法是 [O'Rourke, 1985],它在 O(n3) 时间内运行,有几种特殊情况,而且实现起来要困难得多。 O'Rourke 的算法基于他的观察:“包围凸多面体的最小体积盒子必须至少有两个相邻的面包含多面体的边缘。”没有找到更快的精确算法。

无论如何,由于 O(n3) 算法在实践中对于大型点集可能非常慢,因此对于 3D 和更高维度的最小长方体的快速逼近,人们非常感兴趣。已经提出了几种方法,例如:(1) 只考虑面与多面体面重合的长方体(如 [O'Rourke, 1985] 中讨论的 O(n2),并且可能太大 2 倍) , (2) 对点集的主成分分析(速度很快,但通常会导致较差的解),(3) 对长方体的许多可能方向进行采样的蛮力方法,(4) 将大点集减少到较小的近似集(例如,通过选择包含设定点的离散网格中的单元格)[Barequet & Har-Peled, 1999] 等。所有这些方法都在解决方案的准确性与执行效率之间进行权衡。

因此,您必须决定是否需要准确的结果,或者您是否可以接受近似值并使用参考文章。

【讨论】:

以上是关于如何确定一个实体是不是适合 O(N^2) 中的给定框?的主要内容,如果未能解决你的问题,请参考以下文章

确定给定代码的复杂性

java - 如何使用PriorityQueue集合从Java中的给定数组在O(n)时间内构建最大堆?

如何确定给定时区中的给定时间是不是在postgresql中是DST?

如何确定语法是否适合自顶向下解析?

如何有效地确定给定字符串中最长的单个字符回文?

CF1446F