用最小长度的三个正方形覆盖n个点

时间:2015-11-02 13:26:30

标签: algorithm point

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

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

2 个答案:

答案 0 :(得分:3)

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

  1. 当每个方格触及最小区域矩形的某些边缘时。
  2. 当两个正方形位于最小区域矩形的对角时,而第三个位于内部(不接触最小区域矩形的任何边缘)。
  3. 在第一种情况下,我们可以将一个正方形的角固定在4个矩形角的一个角上,然后将其他两个正方形的角固定在矩形的两个相对(到选定的角)边缘的某处(n每个点的可能位置,然后为每个点确定它所属的最佳平方和最小x

    在第二种情况下,尝试两对相对的矩形角,用于"外部"正方形,然后修复"内部"的一个角落。由所有n*nx点坐标确定的所有y位置上的平方,然后为每个点确定其所属的最佳平方和最小x

    时间复杂度为O(n 3 )。

答案 1 :(得分: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)来对两个基本方向上的点进行排序。