【问题标题】:Choose rectangles with maximal intersection area选择相交面积最大的矩形
【发布时间】:2011-08-18 10:09:55
【问题描述】:

在这个问题中,r 是一个固定的正整数。在平面上给你 N 个大小相同的矩形。侧面是垂直的或水平的。我们假设所有 N 个矩形相交的面积都非零。问题是如何找到这些矩形中的 N-r 个,从而最大化相交的面积。这个问题出现在实际显微镜中,当一个给定的生物标本重复成像时,由于物理原因(例如显微镜和相机部件的不同膨胀),在此过程中对齐会发生轻微变化。我已经表达了维度 d=2 的问题。每个 d>0 都有一个类似的问题。对于 d=1,通过对区间的左侧端点进行排序来获得 O(N log(N)) 解。但是让我们坚持d=2。如果 r=1,可以通过对角点坐标进行排序,在 O(N log(N)) 时间内再次解决问题。

那么,是不是通过先求解 case (N,1) 得到 N-1 个矩形,然后求解 case (N-1,1),得到 N-2 个矩形,等等来解决原始问题,直到我们减少到 N-r 个矩形?我很想看到这个乐观的尝试过程的明确反例。如果程序有效(请证明!)会更有趣,但这似乎过于乐观。

如果 r 固定在某个值 r>1,并且 N 很大,那么这个问题是否属于 NP 类之一?

感谢您对此的任何想法。

大卫

【问题讨论】:

  • 交叉点是指所有这些矩形共有的区域?
  • hmm..不知怎的,你的归约算法感觉不对...我得想一想才能想出一个反例。

标签: algorithm computational-geometry


【解决方案1】:

由于轴对齐矩形的交点是轴对齐矩形,所以有O(N4)个可能的交叉点(O(N)个左,O(N)个右,O(N) ) 顶部,O(N) 底部)。显而易见的 O(N5) 算法是尝试所有这些,检查每个是否包含在至少 N - r 个矩形中。

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

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

【讨论】:

    【解决方案2】:

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

    现在我们需要构建更多的矩形,以便在缩减步骤中至少删除这两个矩形中的一个。

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

    现在,如果您想优化四个矩形的区域,您将删除两个最佳矩形之一,对吗?或者也许您不必这样做,但您不确定哪个决定是最佳的。

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

    【讨论】:

    • 但是如果你在每一步都踢出给出最大 N-r 重叠表面的那个呢?在这种情况下,您可以处理 (N,1) 然后 (N-1,1) 等...(此反例在这种情况下无效)
    • 你能举一个完全明确的整数坐标的反例吗?这与使用实数坐标一样普遍,因为您可以先按一个巨大的因子放大,然后取最接近的整数值。除非完全明确,否则我对反例不满意。
    【解决方案3】:

    后记。这是相当有缺陷的,但可能会引发一些想法。在 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”差分公式。

    【讨论】:

    • 谢谢。我独立得出了非常相似的结论。如果我现在拥有的算法(我会在一分钟内给出详细信息)是正确的,那么我会感到满意,因为我觉得它几乎可以做到。
    【解决方案4】:

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

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

    【讨论】:

    • 非常感谢。很好的反例!正如我在原始帖子中所述,我确实认为贪心算法是错误的。如果我现在拥有的算法(我会在一分钟内给出详细信息)是正确的,那么我会感到满意,因为我觉得它几乎可以做到。
    【解决方案5】:

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

    mhum 对贪心算法的反例很巧妙。看看吧。

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

      • 叹息...我认为这与我的缺陷相同。在这种情况下,对角线上的矩形可能是最佳选择拒绝,但不会被使用,因为它们不在上/下/左/右最远的 r 个矩形中。我认为我的公式在这方面更加稳健 - 但也不完美。
      • @ed 我认为我的证明没问题。如果我知道你的电子邮件,我可以写下证明并发送给你。由于我的排序仅使用一个坐标,因此无论矩形是否在对角线上,极端确实是最远的上/下/左/右。我不知道我的电子邮件地址是否显示在我的个人资料中。
      【解决方案7】:

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

      这依赖于以下假设:对于任何解决方案,至少有一个不合格品必须是复杂外壳的成员。递归应用它会导致:

      计算一个凸包。 收集由以下人员生成的所有候选解决方案的集合:

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

      (船体上一次真的不需要修。)

      如果 h 是初始船体成员的数量,那么复杂度小于 h^r,加上计算初始船体的成本。我假设选择了一个船体算法,这样排序后的数据可以在船体维修中保留和重复使用。

      【讨论】:

        【解决方案8】:

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

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

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

        这个算法有很多缺点,最明显的一个是结果是随机的,因此不能保证是正确的。但与大多数 Monte-Carlo 算法一样,它的扩展性很好,您应该也可以在更高维度上使用它。

        【讨论】:

          猜你喜欢
          • 2017-04-21
          • 1970-01-01
          • 2021-03-20
          • 2018-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多