找到包含所有矩形的最小区域
Posted
技术标签:
【中文标题】找到包含所有矩形的最小区域【英文标题】:find smallest area that contains all the rectangles 【发布时间】:2012-09-09 10:35:07 【问题描述】:这是一道面试题。 我们得到了各种矩形的尺寸,我们必须找出可以包围所有矩形的面积(最小)?矩形也可以旋转。
test case:-
input:
3 //number of rectangles
8 8
4 3
3 4
output:
88
11x8:
+ - - - - - - + + - +
| | | |
| | | |
| | + - +
| | + - +
| | | |
| | | |
+ - - - - - - + + - +
我查看了fitting rectangles in the smallest possible area 之前提出的类似问题 上述方法着眼于所有可能性、旋转,并确定所有布局情况下所有此类可能性的最小值。 难道我们不能建立一个算法,首先找到矩形面积的总和,然后寻找最大长度,宽度?
【问题讨论】:
【参考方案1】:这个问题没有绝对的解决方案,但是有几个近似的解决方案,你可以阅读其中的一些here。
【讨论】:
附注如果你在面试中被问到这个问题,很可能你并不希望你解决这个问题,他们只是想看看你如何解决问题。 "这个问题没有绝对的解决办法" - ???我认为您的意思是,对于大输入(很多矩形),您需要启发式方法,因为详尽的搜索需要太多时间。 @KarolyHorvath 好吧,是的,显然总是有蛮力。我的意思是,没有一种算法具有合理的渐近运行时间,可以给出明确的绝对最小值【参考方案2】:Optimal Rectangle Packing on Non-Square Benchmarks:
给定一组矩形,我们的问题是找到所有封闭的 最小面积的矩形,将包含它们而不重叠。我们 将封闭矩形称为边界框。优化 问题是NP-hard,而决定一组是否 NP-complete 的矩形可以包装在给定的边界框中,通过 减少装箱(Korf 2003)。
New Improvements in Optimal Rectangle Packing:
Korf [2003] 将矩形包装问题分为两个 子问题:最小边界框问题和包含问题 问题。前者找到一个面积最小的边界框, 包含一组给定的矩形,而后者试图打包 给定边界框中的给定矩形。解决的算法 最小边界框问题调用解决 包含问题作为子程序。
最小边界框问题
解决最小边界框问题的一个简单方法是找到 描述一组可行和最大区域的最小和最大区域 潜在的最佳边界框。所有维度的边界框 可以用这个范围内的区域生成,然后在 面积的非递减顺序,直到所有最小的可行解 区域被发现。最小面积是给定的面积之和 矩形。最大面积由边界框决定 通过将边界框高度设置为 最高的矩形,然后将矩形放在第一个 从左到右扫描时的可用位置,并且对于每个 列从下到上扫描。
另见Optimal Rectangle Packing: New Results。
【讨论】:
【参考方案3】:首先你应该检查,是否可以旋转封闭矩形? 无论如何,您可以忽略“矩形”条件并以点为单位解决任务。 你有点数组(它们是矩形的顶点)。你的任务是找到面积最小的封闭矩形。 如果封闭矩形无法旋转,则解决方案很愚蠢,复杂度为 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);
如果矩形可以旋转,则为另一个任务。那么你应该首先:
-
构建矩形中所有点的最小凸多边形。你可以
使用任何现有的算法。复杂度 O(n log n)。例如“格雷厄姆的扫描”:http://en.wikipedia.org/wiki/Graham%27s_scan
对凸多边形使用简单算法。链接:http://cgm.cs.mcgill.ca/~orm/maer.html
您在 wiki 中的任务链接:http://en.wikipedia.org/wiki/Minimum_bounding_rectangle
【讨论】:
:感谢您的解决方案。你能解释一下如何表达输入点(矩形)来制作一个凸多边形吗?我知道如何从凸多边形中找到最小面积包围矩形。 有多个算法。例如 Graham 的扫描:en.wikipedia.org/wiki/Graham%27s_scan。或 QuickHull:algolist.ru/maths/geom/convhull/qhull3d.php. 查看输入数据,您似乎误解了问题所在。问题不在于为位于二维空间中的一组给定矩形找到最小封闭矩形,而是如何在最小矩形内打包一组已知大小的矩形。以上是关于找到包含所有矩形的最小区域的主要内容,如果未能解决你的问题,请参考以下文章
我需要一种算法,可以适应任何大小的n个矩形,在较大的矩形中最小化其面积
python基于图像的掩码mask信息获取病灶区域ROI最小外接矩形坐标位置opencv基于掩码最小外接矩形坐标剪裁原图(crop image by mask rectangle)