找到k个矩形,使它们覆盖最大点数

时间:2010-08-13 12:30:11

标签: algorithm data-structures graph computer-science

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

有人能给我用来解决它的算法吗?或者指出它可以归结为一些已知问题?

4 个答案:

答案 0 :(得分:3)

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

从我能找到的,看起来Set Cover的几何版本也是NP-Complete,这里的论文有一个快速近似算法,利用它是几何的事实:http://www.almaden.ibm.com/u/kclarkson/set_cover/p.pdf。 Set Cover的几何版本是NP-Complete这一事实意味着最大覆盖问题的几何版本也是NP-Complete。

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

希望有所帮助!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

有关详细信息,您需要告诉我们如何指定矩形和点,以及如何存储它们 - 或者在给定输入格式的情况下是否需要帮助选择良好的数据结构。

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

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

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

例如,在这里,所有矩形都被绑定:如果删除任何一个矩形,您将不会发现任何点。然而,很明显看到最好的1解决方案是让矩形2覆盖点(注意矩形1和3可以任意宽,因此大小不是一个有说服力的因素。)

答案 3 :(得分:0)

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