【发布时间】:2011-04-18 21:17:41
【问题描述】:
我有一个不同尺寸的矩形列表。
rects = [100x20, 30x10, 10x10, 70x20, 40x30, 50x10]
我正在尝试从这些矩形中呈现一个表格。如果我有固定数量的列,我可以简单地计算行数和每行和每列的大小,如下所示:
numCols = 4;
for (i = 0; i < rects.size - 1, i++):
rect = rects[i];
col = i % numCols;
row = floor(i / numCols);
columns[col] = max(columns[col], rect.width);
rows[row] = max(rows[row], rect.height);
end for;
现在我希望我的表配置为最大行宽。列数取决于最佳行宽的运行时计算。
根据上面的列表和设置为 140 的最大行,我希望我的表是:
rects = [100x20, 30x10, 70x10, 10x20, 40x30, 10x10]
100x20, 30x10
70x10, 10x20
40x30, 10x10
cols = [100, 30]
rows = [20, 20, 30]
我处理这种情况的第一个想法是为每个可能的列数缓存最大列宽。最后一个总和
max[1] = [100]
max[2] = [100, 30] - wins
max[3] = [100, 40, 70] - 210 > 140
max[4] = [100, 30, 70, 10]
max[5] = [100, 30, 70, 10, 40]
max[6] = [100, 30, 70, 10, 40, 10]
不幸的是,我需要为每个可能的列号创建一个 max 条目。该列表可能会变得非常大。有人知道解决这个优化问题的算法吗?
【问题讨论】:
-
也许你可以添加更多关于你的算法应该解决的问题的细节。您究竟想要优化什么(行数、表格高度)?例如。你的方法给出了 max[2]=[100,10] 而你的例子是 [100,30]。为什么更喜欢第一个?在您的示例中,您永远不会更改矩形的顺序。这是一个要求吗?标题也声明“大小均匀”,但您从未在描述中提及这一点。如果我们对目标有更多了解,我想我们可以找到一个(已知的)算法。
-
最大数组的“相当大”有多大?这似乎是一种明智的做法,贪婪地取最宽的矩形,然后从左边开始放入列中(最宽的矩形必须放在某个地方,你最好尽可能多地利用它下面的空间)。您不必存储最大数组,只是迄今为止最好的数组,计算给定列数的行宽很简单(如果您只是按宽度递减的顺序对矩形进行排序,这是一个快速循环和添加)。如果我正确理解问题,我会将其移至答案。
-
@Howard,你说得对,max[2] = [100, 30]。我已经更新了示例。
-
想象一下这个问题,在一个只给定最大宽度但没有列/行数的表格中显示一个不同大小的缩略图列表。缩略图的顺序很重要。表格的高度是无限的,但最佳解决方案会产生最少的行数。
-
@Howard,“大小均匀”只是意味着一列中的单元格应该具有相同的宽度。项目可能小于其封闭单元格。