【问题标题】:Find a region with maximum sum of top-K points找到一个top-K点总和最大的区域
【发布时间】:2015-12-15 14:21:59
【问题描述】:

我的问题是:我们在 2D 空间中有 N 个点,每个点都有一个正权重。给定一个由两个实数 a,b 和一个整数 k 组成的查询,找到一个大小为 a x b 且边平行于轴的矩形的位置,因此前 k 个点的权重之和,即 k 个最高的点矩形覆盖的权重是否最大化?

欢迎提出任何建议。

附: 有两个相关的问题,已经充分研究过:

  • 最大区域总和:找到总权重总和最高的矩形。复杂度:NlogN。
  • 正交范围的前 K 个查询:在给定矩形中查找前 k 个点。复杂度:O(log(N)^2+k)。

【问题讨论】:

  • 如果我选择覆盖所有点的矩形怎么办?权重将最大化
  • @Nyavro:给定矩形的大小,即 a x b。所以你不能选择覆盖所有点的矩形。
  • 任意旋转的矩形?还是平行于给定轴对的矩形?
  • @TomZych 矩形的边与轴平行。
  • 这可能没有帮助,但在给定的限制条件下,我认为可以肯定地说,如果我们采用任何矩形(甚至是最佳矩形),我们可以移动它(不会丢失任何点内),使得每个垂直和水平边中的一个位于 1 个或多个点上。也许这可以以某种方式使用,例如扫描算法

标签: algorithm geometry computational-geometry


【解决方案1】:

您可以将此问题简化为在矩形中找到两个点:最右边和最上面。因此,您可以有效地选择每一对点并计算前 k 个权重(根据您的说法是 O(log(N)^2+k))。复杂度:O(N^2*(log(N)^2+k))。

现在,给定两个点,它们可能不会形成有效的对:它们可能太远,或者一个点可能在另一点的右侧和顶部。所以,实际上,这会快得多。

我的猜测是最佳解决方案将是最大区域和问题的变体。您能否指出描述该算法的链接?

【讨论】:

  • 你的想法很有趣。我会考虑的。对于最大区域和问题,我们可以在题为《一种统一的算法,用于查找包围矩形和长方体的最大和最小对象的算法》中进行研究。
【解决方案2】:

一个非最佳答案如下:

  1. 生成所有可能的 k-plets 点(它们是 N × N-1 × … × N-k+1,所以这是 O(Nk) 并且可以是通过递归完成)。

  2. 通过消除所有未包含在 a×b 矩形中的 k-plet 来过滤此列表:最坏的情况是 O(k Nk)。

  3. 找到权重最大的 k-plet:最坏的情况是 O(k Nk-1)。

因此,这个算法是 O(k Nk)。

改进算法

当一组点已经太大时,可以通过停止分支递归将步骤 2 集成到步骤 1 中。这不会改变至少扫描一次元素的需要,但它可以显着减少数量:想想没有解决方案的情况,因为所有点都分开超过矩形的大小,可以在 O( N2).

另外,通过对点数组进行相应的预排序,可以使步骤1中的置换生成器按x或y坐标的顺序返回点。这很有用,因为它可以让我们预先放弃一堆更多的可能性。假设数组按 y 坐标排序,那么返回的 k-plet 将按 y 坐标排序。现在,假设我们要丢弃一个分支,因为它包含一个 y 坐标在最大矩形之外的点,我们也可以丢弃所有下一个兄弟分支,因为它们的 y 坐标将大于等于当前已经超出的界限。

这为排序增加了 O(n log n),但在许多情况下改进可能非常显着——同样,当有许多异常值时。应该选择与最小矩形边相对应的坐标,除以 2D 字段的对应边——我的意思是最大坐标减去所有点的最小坐标。

最后,如果所有点都位于 a×b 矩形内,那么算法无论如何都会执行为 O(k Nk)。如果这是一个具体的可能性,应该检查它,一个简单的 O(N) 循环,如果是这样,那么返回具有前 N 个权重的点就足够了,这也是 O(N)。

【讨论】:

  • 感谢您的回答。因为在我的数据中,N 很大(约 1M 点),我认为您的解决方案效率不高。顺便说一句,如果一个区域包含的点少于 k 个,它的分数是所有点的权重之和。所以总会有答案。
  • @user2210078 我认为如果您有更多关于您的案例的详细信息,我们可以改进。 k是多少?点是如何分布的(例如,有多均匀,还有多少空间?a 和 b 的范围是多少?这些都是我们可以用来提高算法效率的东西
  • 我的目标是为任何数据设计一个有效的算法,比如我在帖子中提到的最大区域总和的解决方案。 k 可能很小,大约是 2,3,5 或 10。当然,如果我们知道数据的一些特征,例如点分布,我们可以利用它们来改进我们的算法。在这种情况下,您可以考虑一个示例,我们的数据集是来自一个城市、一个州或整个美国的一组地点(餐馆、电影院等),权重是来自 Yelp 或 Foursquare 的分数。
猜你喜欢
  • 2012-01-09
  • 2022-12-12
  • 1970-01-01
  • 2013-03-05
  • 2020-08-15
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多