Algorithm 找到k个矩形,使其覆盖最大数量的点

Algorithm 找到k个矩形,使其覆盖最大数量的点,algorithm,data-structures,graph,computer-science,Algorithm,Data Structures,Graph,Computer Science,在二维空间中,给定一组矩形,每个矩形覆盖多个点,两个任意矩形之间可能有重叠,对于指定的K个数,我如何找到K个矩形,使它们的并集覆盖最大数量的点? 在这个问题中,如果一个点被两个以上的矩形覆盖,它只被计数一次,我们假设矩形的位置和大小以及点的位置是固定的,如输入中所示 有人能告诉我解决这个问题的算法吗?或者指出它可以简化为一些已知的问题?我认为您需要组合优化算法,该算法可以选择值/节点(例如这里的矩形),以便给定的函数给出最大值。我不知道细节,但你可以在MATLAB中尝试优化我假设你有固定的矩形(

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


有人能告诉我解决这个问题的算法吗?或者指出它可以简化为一些已知的问题?

我认为您需要组合优化算法,该算法可以选择值/节点(例如这里的矩形),以便给定的函数给出最大值。我不知道细节,但你可以在MATLAB中尝试优化我假设你有固定的矩形(也就是说,你不能选择你的矩形有多大,以及它们的位置)。如果您可以选择矩形的大小,那么问题就很简单了。如果您可以选择矩形的位置,这也将是一个不同的问题(通过另一个贪婪算法解决)

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

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

编辑:此解决方案的问题是,在每个步骤中,“将使其成为我发现的点最少的点”的答案不是唯一的,在该步骤中,几个矩形可以填充标准;最后,结果可能是一个选择比另一个更好,而这不可能在那一步决定

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

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

如果有n个矩形,必须选择其中的k个,那么就有
(选择nk)
不同的组合,即
(/(阶乘n)(factorial k)(factorial(-n k))
。在一般情况下,我怀疑您必须枚举这些组合并计算它们的覆盖率。但是,您可以通过按覆盖率排序矩形(即它们所覆盖的点的数量)来缩短这一点,从最大矩形的组合开始,当剩余的矩形不能超过您以前的最佳组合时停止。

这看起来像是几何版本,与密切相关,这两个是NP完全的

从我所能找到的来看,集覆盖的几何版本也是NP完全的,本文有一个快速近似算法,它利用了集覆盖是几何的事实:。集覆盖的几何版本是NP完全的事实意味着最大覆盖问题的几何版本也是NP完全的

当然,你的集是矩形的特殊情况可能仍然适用于精确的多项式时间算法,但我怀疑这一点。也许上面的文章中的参考文献会给你带来一个好的解决方案


希望能有帮助!

Thx,但我需要一个明确的算法似乎是生成树和覆盖问题的结合……恐怕这种贪婪的方法是错误的,因为那些覆盖大量点的矩形可能会严重重叠,而其他覆盖少量点的矩形可能彼此没有重叠rFear not!:-),这种贪婪的方法没有错,但也许我应该重新表述我正在测试的内容,以便更清楚:“哪个矩形,如果删除,将使它成为我发现的点最少的矩形。”按面积排序矩形并不一定有用:一个非常大的矩形可能覆盖很少或根本没有点,因为它不在点集中的区域内;这个区域可以被一个很小的矩形覆盖。另一方面,也许给定的固定矩形集使这成为一个有用的标准。@Jérémie:通过测量覆盖点的面积,这一异议很容易解决。Thx,你是对的,我的问题可以归结为最大覆盖问题,所以它是NP!证明是矛盾的:假设我的问题可以在多项式时间O(POLY(N))内解决,那么最大覆盖率问题可以在时间O(K*POLY(N))内解决,这与MCP是NP相矛盾。@unclaw:不。你必须减少问题的最大覆盖率,而不是相反(为了证明NP完备性)。此外,处于NP和NP完全意味着两件截然不同的事情。每个NP完全问题都是NP问题,但不一定相反。