我的问题是:我们在2D空间中有N个点,每个点都有一个正重量。给定一个由两个实数a,b和一个整数k组成的查询,找到一个大小为axb的矩形的位置,边缘与轴平行,这样前k点的权重之和,即k点最高矩形覆盖的权重最大化?
任何建议都表示赞赏。
P.S .: 有两个相关的问题,已经进行了很好的研究:
答案 0 :(得分:1)
您可以将此问题减少为在矩形中找到两个点:最右边和最顶部。因此,您可以有效地选择每对点并计算前k个权重(根据您是O(log(N)^ 2 + k))。复杂度:O(N ^ 2 *(log(N)^ 2 + k))。
现在,给定两点,它们可能不会形成有效的对:它们可能太远或者一点可能是正确的而另一点是顶点。所以,实际上,这会更快。
我的猜测是最优解是最大区域和问题的变化。你能指出一个描述该算法的链接吗?
答案 1 :(得分:0)
非最佳答案如下:
生成所有可能的点k点(它们是N×N-1×...×N-k + 1,所以这是O(N k )并且可以是通过递归完成。
通过消除未包含在aa×b矩形中的所有k-plets来过滤此列表:这是最坏的O(k N k )。
< / LI>找到具有最大权重的k-plet:这是最坏的O(k N k-1 )。
因此,该算法为O(k N k )。
改进算法
当一组点已经太大时,通过停止分支递归,可以在步骤1中集成步骤2。这不会改变扫描元素至少一次的需要,但它可以显着减少数量:想想没有解决方案的情况,因为所有点的分离都超过了矩形的大小,可以在O中找到( ñ 2 )。
此外,通过相应地预先对点阵列进行排序,可以使步骤1中的置换生成器按x或y坐标顺序返回点。这很有用,因为它让我们可以预先丢弃一堆更多的可能性。假设数组按y坐标排序,因此返回的k-plets将按y坐标排序。现在,假设我们正在丢弃一个分支,因为它包含一个y坐标在最大矩形之外的点,我们也可以丢弃所有下一个兄弟分支,因为它们的y坐标将大于等于当前已经超出的分支。界限。这为排序添加了O(n log n),但在许多情况下,改进可能非常显着 - 同样,当有许多异常值时。应该选择与最小矩形边相对应的坐标,除以2D字段的相应边 - 我指的是最大坐标减去所有点的最小坐标。
最后,如果所有点都位于a×b矩形内,则算法无论如何都会执行O(k N k )。如果这是一个具体的可能性,应该检查一个简单的O(N)循环,如果是这样,那么它足以返回具有前N个权重的点,也就是O(N)。