【问题标题】:Find k rectangles so that they cover the maximum number of points找到k个矩形,使它们覆盖最大点数
【发布时间】:2011-03-29 10:52:56
【问题描述】:

在二维空间中,给定一堆矩形,每个矩形覆盖多个点,并且两个任意矩形之间可能存在重叠,对于指定的数字 K,我如何找到 k 个矩形,使得它们的并集覆盖最大点数? 在这个问题中,如果一个点被两个以上的矩形覆盖,它只计算一次,我们假设矩形的位置和大小以及点的位置在输入中是固定的。

谁能给我用来解决它的算法?或者指出可以归结为某个已知问题?

【问题讨论】:

  • 看起来像是生成树和覆盖问题的结合......

标签: algorithm data-structures graph computer-science


【解决方案1】:

这看起来像是Maximum Coverage Problem 的几何版本,与Set Cover Problem 密切相关,并且这两个是NP-Complete。

据我所知,Set Cover 的 Geometric 版本似乎也是 NP-Complete 并且这里的论文有一个快速逼近算法,它利用了它是几何的事实:http://www.almaden.ibm.com/u/kclarkson/set_cover/p.pdf。 Set Cover 的几何版本是 NP 完全的,这意味着最大覆盖问题的几何版本也是 NP 完全的。

当然,集合是矩形的特殊情况可能仍然适用于精确的多项式时间算法,但我对此表示怀疑。也许上述论文中的参考资料可能会引导您找到一个好的解决方案。

希望有帮助!

【讨论】:

  • Thx,你说得对,我的问题可以归结为最大覆盖问题,所以是NP!证明是矛盾的:假设我的问题可以在多项式时间 O(POLY(N)) 内解决,那么最大覆盖问题可以在 O(K*POLY(N)) 时间内解决,这与 MCP 是 NP 相矛盾。
  • @outlaw:不。你必须减少对问题的最大覆盖率,而不是反过来(为了证明 NP 完备性)。此外,处于 NP 和 NP 完全意味着两件非常不同的事情。每个 NP 完全问题都属于 NP,但不一定反过来。
【解决方案2】:

我认为您需要可以选择值/节点(例如这里的矩形)的组合优化算法,以便给定函数给出最大值。我不知道详细,但您可以尝试在 MATLAB 中进行优化

【讨论】:

  • 谢谢,但我想要一个明确的算法
【解决方案3】:

如果你有 n 个矩形,k 个你必须选择,那么就有(choose n k) 不同的组合,即(/ (factorial n) (factorial k) (factorial (- n k)))。在一般情况下,我怀疑您必须枚举这些组合并计算它们的覆盖范围。但是,您可以通过按覆盖范围(即它们自己覆盖的点数)对矩形进行排序,从最大矩形的组合开始,并在剩余的矩形不能超过您之前的最佳组合时停止,从而缩短这一点。

【讨论】:

  • 按区域排序矩形不一定有用:一个非常大的矩形可能覆盖很少或根本没有点,因为它不在点集中的区域;这个区域可以被一个非常小的矩形覆盖。另一方面,也许给定的一组固定矩形使其成为有用的标准。
  • @Jérémie:通过测量覆盖点的面积可以轻松解决该异议。我将相应地进行编辑。
【解决方案4】:

我假设您有固定的矩形(即,您无法选择矩形的大小以及它们的位置)。如果您可以选择矩形的大小,那么问​​题将是微不足道的。如果您可以选择放置矩形的位置,这也是一个不同的问题(由另一个贪心算法解决)。

有关更多详细信息,您需要告诉我们您的矩形和点是如何指定的,以及它们是如何存储的——或者根据您的输入格式,您是否需要帮助选择一个好的数据结构。

现在,贪婪 解决您的问题的方法如下。最初从所有“选择”的矩形作为覆盖点开始。然后,一个接一个地删除覆盖点最少的矩形,直到你的集合中只有 K 个矩形。该算法的复杂性是多项式的,其效率取决于您将如何实现“找出哪个矩形覆盖最少点”的查询。使用堆,您可以在 O(1) 中完成此操作,并通过预处理阶段来构建堆(其复杂性将取决于您的点的存储方式)。

编辑 :这个解决方案的问题在于,在每一步,“将使它,所以我发现的点最少”的答案不是唯一的,几个矩形可以,在那步骤,填写准则;最终,可能会证明一个选择会比另一个更好,而这在那个步骤中是无法确定的......

   /---------\
   |2        |
/-----\   /-------\
|1 | *|   |* |   3|
\-----/   \-------/
   |         |
   \---------/

例如,这里所有的矩形都是绑定的:如果你删除任何一个矩形,你就不会发现任何点。但是很明显,最好的 1 解决方案是让矩形 2 覆盖这些点(请注意,矩形 1 和 3 可以任意宽,因此大小不是一个重要因素)。

【讨论】:

  • 这个贪心的方法恐怕是错误的,因为覆盖点多的矩形可能相互重叠不好,而覆盖点少的矩形可能相互不重叠
  • 不要害怕! :-),这种贪婪的方法并没有错,但也许我应该改写我正在测试的内容,以便更清楚:“如果删除哪个矩形,它将使它成为最少量的点。”
猜你喜欢
  • 2016-02-25
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2018-09-26
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多