【问题标题】:Covering n points with three squares of minimum length用三个最小长度的正方形覆盖 n 个点
【发布时间】:2015-11-02 13:26:29
【问题描述】:

给定一组n(a_1, b_1), (a_2, b_2), ..., (a_n, b_n)。需要找到最小的x 使得三个axis parallel 正方形每个长度为x 一起覆盖所有点。

我可以找到包含所有点的面积最小的矩形。这个矩形可以以某种方式使用吗?或者关于如何解决这个问题的任何提示?

【问题讨论】:

  • 也许使用某种聚类算法将点分成三个簇,然后分别用一个正方形覆盖它们?

标签: algorithm point


【解决方案1】:

我认为,考虑两种情况就足够了:

  1. 当每个正方形接触面积最小的矩形的某个边缘时。
  2. 当两个正方形位于最小面积矩形的对角,而第三个正方形位于内部时(不接触最小面积矩形的任何边缘)。

在第一种情况下,我们可以将一个正方形的角固定在 4 个矩形的角之一处,然后将其他两个正方形的角固定在矩形的两个相对(到所选角)边缘的某个位置(n 每个可能的位置) ,然后为每个点确定它所属的最佳方格和最小值x

在第二种情况下,为“外部”正方形尝试两对相对的矩形角,然后在所有 n*n 由所有 xy 点坐标确定的位置处修复“内部”正方形的一个角,然后为每个点确定它所属的最佳方格和最小值x

时间复杂度为 O(n3)。

【讨论】:

  • 不错。我们可以在 O(n^2) 时间内完成案例 2,首先按照最大范数(即 d(x, y) = max(|x1-x2|, |y1- y2|)),到 2 个已经选择的对角。然后从 x=0 开始,遍历这个列表:每个访问的点都将我们的暂定 x 增加到这个新的 min-dist 值(并且我们在概念上将此点添加到相应的正方形)。 ...
  • ... 我们还维护所有剩余点的最左侧和最右侧的 x 值,以及最顶部和最底部的 y 值(如果我们再预处理 4 个点,这些都可以在 O(1) 中更新排序操作)。一旦 max(rightmost-leftmost, topmost-bottommost)
  • @j_random_hacker:这也适用于案例 1。并且(在这两种情况下)这种方法保证了 O(sorting(n)) 最坏情况的复杂性。您是否考虑将其作为单独的答案发布?
  • 你说得对,它实际上比我想象的要快:) 有时间我会尽快写出来的。
  • 有没有办法将这种方法推广到任意多个正方形?如果n 是点数,k 是方格数,那么在O(k * n^3) 中做是我目前能想到的最好的方法。
【解决方案2】:

@EvgenyKluev 的答案似乎朝着正确的方向发展,但我想解决一些微妙的问题。

由于我没有看到x 是整数的限制,您可能希望在x 上使用二进制搜索来指导您的算法,并在x 仍然可用的范围为时找到合适的终止条件足够小(您也可以对整数 x 进行二进制搜索,但不需要终止条件)。

在矩形的一个角放置一个正方形(这是您必须做的事情,证明起来有点简单)限制了您在放置其他两个正方形时的搜索空间:设 A 是由角对齐的第一个正方形,令 S 为所有点的集合。取 S-A 并找到该点集的封闭矩形。如果存在的话,将剩余的两个正方形放在 S-A 的封闭矩形的对角处始终是一种解决方案(可能只有一对对角适合)。

因此,一种算法可以 - 非常高级 - 像这样进行

binary search for x on [0,N]:
    find R(S), the enclosing rectangle of S
    for each corner C of R(S):
        align one square at C, let the points covered by that square be A
        find R(S-A)
        do two squares aligned at opposite corners of R(S-A) cover S-A?

至于二分搜索,我真的不能说它会以多快的速度收敛到只允许一个正方形对齐的范围,此时您可以直接计算值x - 我希望具有任意精度,你可以把它弄得很糟糕。每次迭代都需要 O(n log n) 来对两个基本方向上的点进行排序。

【讨论】:

  • 这种方式也不错。关于二分搜索的几个 cmets:如果我们对所有 x 和 y 坐标进行排序(在减去“起始”角的坐标之后)并使用结果数组进行二分搜索,那么只需要 O(log n) 搜索步骤。由于所有其他事情最多可以通过两次线性扫描完成,因此整个算法的最坏情况复杂度为 O(n log n)。
  • @EvgenyKluev 听起来不错。在您阐明如何将其用于二进制搜索之前,我还没有正确理解您的想法,这就是为什么我认为首先需要澄清的原因。很高兴我现在明白了!
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 2013-11-28
  • 2012-12-25
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2022-10-02
相关资源
最近更新 更多