盒子堆叠问题的o(n ^ 2)解决方案是否有更快?
解决方案
这可以通过使用2D范围查询数据结构来优化的。在问题上给出的链接中解释的动态编程解决方案:
如在链接中,对于输入尺寸的框 $(w_i,d_i,h_i)$ ,考虑框的所有旋转,但保持第一个维度始终 $ \ ge $ 第二维度。因此,每个输入框对应于三个框,并考虑所有这些 $ 3n $ 框,并在基础的减少区域中对它们进行排序(即前两个产品尺寸)。
让这种排序序列是 $(a_1,b_1,c_1),(a_2,b_2,c_2),\ ldots,(a_ {3n},b_ {3n},c_ {3n})$ 。
让 $ dp [i] $ 是您可以使用第一个 $ i $ 框在此序列中,使最顶层框是 $ i ^ {th} $ box。最初 $ dp [i]= 0 $ 对于所有 $ i $ 。复发是
$ dp [i]= c_i + \ max _ {\ subsamp {j a_i \\ b_j> b_i}} dp [j] $
现在,而不是消费 $ \ mathcal {o}(n)$ 时间来查找此最佳 $ j $ ,我们将使用某些数据结构更快地进行。想想每个框 $(a_j,b_j,c_j)$ 作为一个点 $(a_j,b_j)$ 在2D平面中,具有值 $ dp [j] $ 。现在我们想要找到的是矩形 $ [a_i + 1,inf] \ times [b_i + 1,inf] $ ,它具有最大值。请注意,我们可以忽略约束 $ j ,因为它将被隐式满足维度约束。
为此,构造一个 2d段树aka fenwick树(查看2d段树的压缩'压缩'),使用 $ a_i $ 作为外部段树中的值, $ b_i $ 作为内部段树中的值。您还可以使用大多数其他2D范围查询数据结构。
因此,问题可以在 $ \ mathcal {o}中解决问题(n \ log ^ 2 {} n)$ time,以及 $ \ mathcal {o}(n \ log {} n)$ 空格。不隶属于 cs.stackexchange