找到包含所有矩形的最小面积

10

这是一个面试问题。
给出各种矩形的尺寸,我们需要找到能够包裹它们所有的矩形的最小面积? 矩形也可以旋转。

test case:-
input:
3   //number of rectangles
8 8
4 3
3 4

output:
88

11x8:
+ - - - - - - + + - +
|             | |   |
|             | |   |
|             | + - +
|             | + - +
|             | |   |
|             | |   |
+ - - - - - - + + - +
我之前看过一个类似的问题fitting rectangles in the smallest possible area
上述方法考虑了所有可能性,包括旋转,并在所有布局情况下确定最小值。
我们不能基于这样的算法,首先找到矩形的面积总和,然后寻找最大长度和宽度吗?
3个回答

7

这个问题没有绝对的解决方案,但有几种近似的解决方案,你可以在这里阅读一些相关内容。


如果你在面试中被问到这个问题,很可能不需要你解决它,他们只是想看看你如何解决问题。 - pseudoDust
3
这个问题没有绝对的解决方案。我认为你的意思是对于一个大输入(很多矩形),你需要启发式算法,因为穷举搜索需要太多时间。 - Karoly Horvath
@KarolyHorvath 嗯,显然总有暴力算法。我的意思是,没有一种具有合理渐进运行时间的算法可以给出一个明确的绝对最小值。 - pseudoDust

7

非方形基准下的最优矩形装箱:

给定一组矩形,我们的问题是找到所有包含它们且不重叠的最小面积外接矩形。我们称之为边界框。优化问题是NP-hard,而判断一组矩形能否在给定的边界框中放置是NP-complete问题,通过从bin-packing(Korf 2003)中减少实现。

最优矩形装箱新改进:

Korf [2003] 将矩形装箱问题分为两个子问题:最小外接矩形问题和包含问题。前者查找能够包含给定矩形集的最小面积边界框,而后者尝试将给定的矩形放入给定的边界框中。解决最小外接矩形问题的算法将调用解决包含问题的算法作为一个子程序

最小外接矩形问题

解决最小外接矩形问题的一种简单方法是找到描述可行且可能最优边界框集合的最小和最大面积。可以生成所有维度的边界框,其面积在此范围内,并按非递减顺序进行测试,直到找到最小面积的所有可行解为止。最小面积是给定矩形的面积之和。最大面积由贪心算法找到的边界框决定,将边界框高度设置为最高矩形的高度,然后从左到右扫描时在第一个可用位置放置矩形,并对于每一列从下到上进行扫描。

另请参阅最优矩形装箱:新结果.


1
首先,您应该检查一下,是否可以旋转包围矩形? 无论如何,您都可以忽略“矩形”条件并按点解决任务。 您有一个点数组(这些点是矩形的顶点)。您的任务是找到最小面积的包围矩形。 如果包围矩形不能旋转,则解决方案很简单,复杂度为O(n)。
生成矩形数组并创建点数组,这很简单:
long n; // Number of vertexes
point arr[SIZE]; //Array of vertexes
long minX = MAXNUMBER, minY = MAXNUMBER, maxX = -MAXNUMER, maxY = -MAXNUMBER;
for (long i = 0; i < 4 * n; i++)
{
    minX = MIN(minX, arr[i].x);
    minY = MIN(minY, arr[i].y);
    maxX = MIN(maxX, arr[i].x);
    maxY = MIN(maxY, arr[i].y);
}
long width = maxX - minX, height = maxY - minY;
printf("%ddX%ld", width, height);

如果矩形可以旋转,则您需要首先执行以下操作:

  1. 构建所有点的最小凸多边形。您可以使用现有算法之一。复杂度为O(n log n)。例如 "Graham's Scan":http://en.wikipedia.org/wiki/Graham%27s_scan
  2. 使用简单的凸多边形算法。链接:http://cgm.cs.mcgill.ca/~orm/maer.html

您在维基百科上的任务链接:http://en.wikipedia.org/wiki/Minimum_bounding_rectangle


谢谢你的解决方案。你能再详细解释一下如何表达输入点(矩形)以生成凸多边形吗?我已经理解了如何从凸多边形中找到最小面积包围矩形。 - k53sc
有多个算法可供选择。例如 Graham's scan:http://en.wikipedia.org/wiki/Graham%27s_scan。或者 QuickHull:http://algolist.ru/maths/geom/convhull/qhull3d.php。 - Gloomcore
4
看起来你误解了问题的输入数据。问题不是要在二维空间中找到一组矩形的最小外接矩形,而是如何将一组已知大小的矩形放入一个最小的矩形内部。 - salva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接