当前位置: 首页 > 知识库问答 >
问题:

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

廖弘伟
2023-03-14

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

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

共有2个答案

赵嘉赐
2023-03-14

@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?

至于二分搜索法,我真的不能说它会多快收敛到只允许一个正方形排列的范围,在这一点上,你可以直接计算值< code>x -我希望以任意的精度,你可以任意地变坏。每次迭代需要O(n log n)来对两个基本方向上的点进行排序。

漆雕修德
2023-03-14

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

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

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

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

时间复杂度为O(n3)。

 类似资料:
  • 将求解第一个点的第一个圆放置在适当位置。 通过检查这两个点之间的距离是否小于2*r来求解最小圈数中的第二个点。并继续处理所有n个点。我认为是贪婪算法,但它是最优的,线性的吗?

  • 这个问题出现在一个挑战中,但由于它现在已经关闭,询问它应该是可以的。 问题(不是这个问题本身,这只是背景资料)可以这样直观地描述,借用他们自己的形象: 我选择了最优解决。这可能是(对于决策变体)一个NP完全问题(它肯定是在NP中,而且它闻起来像一个精确覆盖,尽管我还没有证明一个一般的精确覆盖问题可以简化为它),但那很好,它只需要在实践中快速,而不一定是在最坏的情况下。在这个问题的背景下,我对任何近

  • 已经有一段时间了,我一直被这个困扰着#新手开发者 我正在制作一个圆形进度条。问题是动画圈没有利用进度条的可用空间。 屏幕截图应该解释这个问题。 蓝色的不完整圆圈是圆形进度条。黄色方块是进度条的背景。红色箭头是未使用的空间,这是值得关注的问题。 progressbar和背景的大小通过代码设置。我想让圆形进度条使用整个空间。 比赛活动。JAVA activity_race_live.xml circu

  • 一个圆覆盖一个点,如果该点位于圆内。如果一个点与圆心的距离小于或等于r,则该点位于圆内。

  • 给定一个点集S,要求用2个固定半径r的圆复盖最大数目的点。通过考虑距离小于2r的每对点,可以计算出一个圆盘所能覆盖的最大点数。通过一对点可以构造2个圆。从所有这样的组合中,选择覆盖最大点的圆和覆盖第二最大点的圆。但它会给出最优答案吗,还是这种方法要做一些改变呢?