给定一个大的立方体(轴对齐并在整数坐标上)和许多较小的立方体(也是轴对齐并在整数坐标上)。我们怎样才能检查较大的立方体是否被较小的立方体完全填满。
目前我们检查:
这适用于少量立方体,但我们需要支持尺寸大于2 ^ 32的立方体测试。即使在2 ^ 16时,填充大立方体所需的小立方体数量也足够大,以至于步骤2需要一段时间(O(n ^ 2)检查每个立方体与其他立方体不相交)。
有更好的算法吗?
修改
这似乎有些混乱。我不是想把一个立方体分成更小的立方体。那已经完成了。我们程序的一部分将大型OpenCL范围(整数坐标上的轴对齐立方体)拆分为许多适合硬件作业的较小范围。
我正在做的是挂钩这个系统并检查它产生的作业是否正确覆盖了大的初始范围。我上面的算法有效,但它很慢,并且考虑到我们必须运行的测试数量,我希望尽可能快地保持这些测试。
答案 0 :(得分:1)
我们正在谈论3D吗? 对于2D,可以执行类似(但更简单)的过程(我相信,O(n log n)运行时算法)。
以下基本概念是the sweep-line algorithm。
请注意,矩形交叉可以通过检查任何其他多维数据集中是否包含任何多维数据集的任何角来完成。
您可以按以下方式改进(2):
将每个立方体拆分为yz平面上的2个矩形(因此,您有2个由同一组4(y,z)坐标定义的矩形,但矩形之间的x坐标不同)。
将具有较小x坐标的矩形定义为立方体的起点,将另一个矩形定义为立方体的末尾。
按x坐标
最初为空interval tree (每个间隔还应存储对其所属矩形的引用)
对于每个矩形:
在区间树中查找矩形每个点的y坐标 对于每个匹配区间,查找其矩形并检查该点是否也包含在z坐标内(这是所有必需的,因为树只包含正确范围内的x坐标,我们通过执行以下操作来检查y坐标间隔查找) 如果是,我们有重叠。
如果矩形是多维数据集的开头,请将矩形的2 y坐标作为间隔插入到区间树中。
运行时间介于O(n)(最佳情况)和O(n 2 )之间(最差情况),具体取决于x坐标和y坐标的重叠程度(更重叠更糟糕。)
答案 1 :(得分:0)
答案 2 :(得分:0)
另一个问题,再次只讨论原始问题中的第2步:
2^18
。这些坐标定义了空间填充曲线的间隔,因此对它们进行排序并查找重叠。时间复杂度可能由排序主导,空间复杂度可能相当大。