我有一个不同尺寸的矩形列表。计算表格布局的最佳列数 - 只给出表格宽度和矩形列表
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 [2] = [100,10],而你的例子是[100,30]。你为什么喜欢第一个?在你的例子中,你永远不会改变矩形的顺序。这是一个要求吗?此外,标题中提到“尺寸均匀”,但您从未在描述中提到过这一点。如果我们更了解目标,我想我们可以找到一个(已知的)算法。 – Howard 2011-03-02 18:15:36
最大阵列的“相当大”有多大?这似乎是一个明智的做法,贪婪地采取最宽的矩形,然后从左边开始放在列中(最宽的矩形必须去某处,并且尽可能多地使用它下面的空间)。您不必存储max数组,只是最好的数组,并且对于给定数量的列计算行宽是微不足道的(如果您按照宽度递减的顺序对矩形进行排序,这是一个快速循环,加)。如果我正确地理解了这个问题,我会将其转到答案。 – 2011-03-02 20:13:05
@霍华德,你最好[2] = [100,30]。我已经更新了这个例子。 – 2011-03-02 21:28:37