检查较小的立方体填充较大的立方体

时间:2013-08-15 10:28:01

标签: c algorithm geometry

给定一个大的立方体(轴对齐并在整数坐标上)和许多较小的立方体(也是轴对齐并在整数坐标上)。我们怎样才能检查较大的立方体是否被较小的立方体完全填满。

目前我们检查:

  1. 对于每个小立方体,它都被大立方体完全包含。
  2. 它不与任何其他小立方体相交。
  3. 小立方体的体积总和等于大立方体的体积。
  4. 这适用于少量立方体,但我们需要支持尺寸大于2 ^ 32的立方体测试。即使在2 ^ 16时,填充大立方体所需的小立方体数量也足够大,以至于步骤2需要一段时间(O(n ^ 2)检查每个立方体与其他立方体不相交)。

    有更好的算法吗?

    修改

    这似乎有些混乱。我不是想把一个立方体分成更小的立方体。那已经完成了。我们程序的一部分将大型OpenCL范围(整数坐标上的轴对齐立方体)拆分为许多适合硬件作业的较小范围。

    我正在做的是挂钩这个系统并检查它产生的作业是否正确覆盖了大的初始范围。我上面的算法有效,但它很慢,并且考虑到我们必须运行的测试数量,我希望尽可能快地保持这些测试。

3 个答案:

答案 0 :(得分:1)

我们正在谈论3D吗? 对于2D,可以执行类似(但更简单)的过程(我相信,O(n log n)运行时算法)。

以下基本概念是the sweep-line algorithm

请注意,矩形交叉可以通过检查任何其他多维数据集中是否包含任何多维数据集的任何角来完成。

您可以按以下方式改进(2):

  • 将每个立方体拆分为yz平面上的2个矩形(因此,您有2个由同一组4(y,z)坐标定义的矩形,但矩形之间的x坐标不同)。

    将具有较小x坐标的矩形定义为立方体的起点,将另一个矩形定义为立方体的末尾。

    Image

  • 按x坐标

  • 对矩形进行排序
  • 最初为空interval tree (每个间隔还应存储对其所属矩形的引用)

  • 对于每个矩形:

    • 在区间树中查找矩形每个点的y坐标 对于每个匹配区间,查找其矩形并检查该点是否也包含在z坐标内(这是所有必需的,因为树只包含正确范围内的x坐标,我们通过执行以下操作来检查y坐标间隔查找) 如果是,我们有重叠。

    • 如果矩形是多维数据集的开头,请将矩形的2 y坐标作为间隔插入到区间树中。

    • 否则,删除树中2 y坐标定义的间隔。

运行时间介于O(n)(最佳情况)和O(n 2 )之间(最差情况),具体取决于x坐标和y坐标的重叠程度(更重叠更糟糕。)

答案 1 :(得分:0)

  • 订购插入式多维数据集
  • 将最大的插入立方体插入多维数据集的一个角,并将剩余的多维数据集拆分为子多维数据集
  • 在第一个适合的子多维数据集中插入第二大插入多维数据集,并将此子多维数据集的剩余子多维数据集添加到子多维数据集

答案 2 :(得分:0)

另一个问题,再次只讨论原始问题中的第2步:

  1. 定义具有良好空间局部性的空间填充曲线,例如3D Hilbert Curve
  2. 对于每个立方体,计算曲线上的坐标对,以获得曲线进入和离开立方体的点。空间填充曲线将不止一次进入和留下一些立方体,为这些情况计算多对坐标。
  3. 你现在已经知道我不知道有多少对坐标,但我猜不会超过2^18。这些坐标定义了空间填充曲线的间隔,因此对它们进行排序并查找重叠。
  4. 时间复杂度可能由排序主导,空间复杂度可能相当大。