选择具有最大交叉区域的矩形

时间:2011-08-18 10:09:55

标签: algorithm computational-geometry

在这个问题中,r是一个固定的正整数。在平面中给出N个矩形,大小相同。侧面可以是垂直的也可以是水平的。我们假设所有N个矩形的交叉区域具有非零区域。问题是如何找到这些矩形的N-r,以便最大化交叉区域。当在实际显微镜中重复成像给定的生物样本时,该问题出现,并且由于物理原因(例如显微镜和照相机的部件的不同膨胀),在该过程期间对准稍微改变。我已经表达了维度d = 2的问题。每个d> 0存在类似的问题。对于d = 1,通过对间隔的左手端点进行排序来获得O(N log(N))解。但是我们坚持使用d = 2。如果r = 1,则可以通过对角点的坐标进行排序来再次解决时间O(N log(N))中的问题。

所以,通过首先解决案例(N,1)获得N-1个矩形,然后求解案例(N-1,1),得到N-2个矩形等来解决原始问题,直到我们减少到Nr矩形?我有兴趣看到这个乐观尝试过程的明确反例。如果程序有效,那就更有意思了(请证明!),但这似乎过于乐观了。

如果r固定在某个值r> 1且N很大,那么NP类之一会出现这个问题吗?

感谢您对此的任何想法。

大卫

8 个答案:

答案 0 :(得分:3)

由于轴对齐矩形的交点是轴对齐矩形,因此有O(N 4 )可能的交点(O(N)左,O(N)权,O(N) )顶部,O(N)底部)。明显的O(N 5 )算法是尝试所有这些,检查每个是否包含在至少N - r矩形中。

对O(N 3 )的改进是尝试X维度中的所有O(N 2 )区间,并在Y维度上运行1D算法包含给定X间隔的矩形。 (矩形只需要排序一次。)

N有多大?我希望花哨的数据结构可能会导致O(N 2 log N)算法,但如果立方算法就足够了,那就不值得花时间了。

答案 1 :(得分:2)

我想我有一个反例。假设你有r := N-2。即你想找到两个最大重叠的矩形。假设您必须覆盖相同区域的矩形(=最大重叠)。这两个将是最终的最佳结果。

现在我们需要构建一些更多的矩形,这样两个中的至少一个会在缩小步骤中被删除。

假设我们有三个重叠很多的矩形......但它们并不是最佳的。它们与其他两个矩形的重叠区域非常小。

现在,如果要优化四个矩形的区域,您将删除两个最佳矩形中的一个,对吗?或者你可能没有,但你不确定哪个决定是最佳的。

所以,我认为你的缩减算法并不完全正确。 Atm我不确定是否有一个好的算法,或者它属于哪个复杂类。如果我有时间,我会考虑它:)

答案 2 :(得分:1)

<强>后记即可。这是非常有缺陷的,但可能会引发一些想法。在象限中靠近X轴和Y轴的异常值的情况下尤其有缺陷 - 它们将倾向于相互加强,就好像它们都是45度一样,以一种可能无法制造的方式将溶液推离该象限感。

-

如果r比N小很多,并且N相当大,请考虑这个:

找到平均中心 通过(X - center.x)+(Y - center.y)和(X - center.x) - (Y - center.y)将矩形分为2个序列,其中X和Y是每个矩形的中心。

对于任何解决方案,所有拒绝矩形将是最多4个子序列的成员,每个子序列是2个序列中每个序列的头部或尾部。假设N比r大很多,大部分时间都是对序列进行排序 - O(n log n)。

要找到解决方案,首先通过删除每个序列的头部和尾部的r矩形来找到给定的交点。使用此基础交集来消除对已知解决方案中的“核心”矩形集的考虑。这将减少交叉计算,只需使用最多4 * r + 1个矩形。

4个序列头部和尾部中的每一个应该与r个矩形的数组相关联,每个条目表示通过将“核心”与来自头部或尾部的i个最内部矩形相交而给出的交叉点。这种预计算降低了从O(r ^ 4)到O(r ^ 3)求解的复杂性。

这并不完美,但应该很接近。

具有小r的缺陷将来自处于偏离角度的待拒绝,而替代方案稍微好一些但是在2个轴中的一个上。最大错误可能是可计算的。如果这是一个问题,请使用真实的非交叉区域计算,而不是我使用的简单“X + Y”差分公式。

答案 3 :(得分:1)

这是对提问者提出的贪婪算法的一个明确的反例(N = 4且r = 2)。

enter image description here

这些矩形中的三个之间的最大交点位于黑色,蓝色和绿色矩形之间。但是,很明显,这三个中任意两个之间的最大交点小于黑色和红色矩形之间的交点。

答案 4 :(得分:0)

我现在有一个算法,非常类似于上面的Ed Staub,具有相同的时间估计。它与Ed的有点不同,因为它对所有r都有效

mhum对贪婪算法的反例很整洁。看一看。

答案 5 :(得分:0)

我还在尝试习惯这个网站。不知怎的,我之前的回答被截断为两句话。感谢大家的贡献,特别是对于那些贪婪算法的反例非常令人满意的mhum。我现在对自己的问题有一个答案。我相信它尽可能好,但复杂性的下限对我来说太难了。我的解决方案类似于上面的Ed Staub并给出了相同的复杂度估计值,但适用于r> 0的任何值。

我的一个矩形由左下角决定。设S是左下角的集合。在时间O(N log(N))中,我们根据x坐标的大小将S排序为Sx。我们不关心具有相同x-coord的两个左下角之间的Sx内的顺序。类似地,通过使用y坐标的大小来定义排序的序列Sy。现在让u1,u2,u3和u4为u1 + u2 + u3 + u4 = r的非负整数。当我们删除我们现在明确命名的各种矩形时,我们计算该区域会发生什么。我们首先移除u1大小的Sx头和ux大小的Sx尾。让Syx成为从Sy中删除这些u1 + u2条目的结果。我们删除了u3大小的Syx头和u4大小的Syx尾部。现在可以证明(u1,u2,u3,u4)的这些可能选择之一给出了期望的最大交叉区域。 (如果你想要证明细节的pdf,请给我发电子邮件。)这样的选择的数量等于4-d欧几里德空间中正四面体中的整数点的数量,其中4个点的顶点的坐标和为r,并且这4个坐标中的3个等于0.这是由四面体的体积限定的,给出了O(r ^ 3)的复杂度估计值。

所以我的算法的时间复杂度为O(N log(N))+ O(r ^ 3)。

答案 6 :(得分:0)

我相信这会产生完美的解决方案。 David的解决方案更容易实现,并且在大多数情况下应该更快。

这依赖于以下假设:对于任何解决方案,至少有一个拒绝必须是复杂船体的成员。递归地应用这导致:

计算凸包。 收集所有候选解决方案的集合:

{Remove a hull member, repair the hull} r times

(船体最后一次不需要修理。)

如果h是初始船体成员的数量,那么复杂性小于 h ^ r,加上计算初始船体的成本。我假设选择了一种船体算法,以便在船体修理中保存和重复使用已排序的数据。

答案 7 :(得分:-1)

这只是一个想法,但如果N非常大,我可能会尝试蒙特卡罗算法。

想法是生成随机点(例如,均匀地在所有矩形的凸包中),并评估每个随机点的执行方式。如果随机点在N-r或更多矩形中,则更新N-r矩形的每个子集的命中数。

最后,其中随机点最多的N-r矩形子集就是你的答案。

该算法有许多缺点,最明显的一个是结果是随机的,因此不能保证是正确的。但是,正如大多数蒙特卡罗算法一样,它可以很好地扩展,你也应该能够在更高的维度上使用它。