[英]Calculating the optimal number of columns for a table layout - Only given the table width and a list of rectangles
我有一个不同尺寸的矩形列表。
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]
我接近这种情况的第一个想法是为每个可能的colums数缓存最大列宽。 总和<=最大行宽的最后一个条目然后获胜。
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]
不幸的是,我需要为每个可能的列号创建一个最大条目。 该列表可以变得非常大。 有人知道一种算法来解决这个优化问题吗?
我只能看到您的解决方案的优化:
假设:
MaxAllowedWidth
- 所有列宽度的最大允许总和
在寻找可能的解决方案(最后一个表)时,当总列宽超过MaxAllowedWidth
时,请停止尝试添加新列。 在您的示例中,您应该停止第三步,不要尝试4,5,6列,因为3列已经占用了更多的空间。 请注意,在此步骤中,我们仅考虑第一行项目。
按相反顺序浏览上一步中收到的可能列号。 第一个适用的解决方案将是最佳的,因为它将具有最小可能的行数。
在第2步,您应该检查此列数是否真的适合您的MaxAllowedWidth
。 在您的示例中,您将从总宽度= 130(100 + 30)开始。 然后通过列,您应该检查是否应该放大此特定列。 如果应放大色谱柱,则检查放大的色谱柱是否会占用更多的空间。 如果它将尝试使用较少的列的解决方案。 此检查将允许您提前退出并跳过无用的迭代/操作。
问题描述不是很清楚,在我阅读评论之前,我没有得到你想要的东西。 max row width
对我来说没有意义, total columns width
听起来更好,IMO。
要完成此问题,请在此处生成表格布局。 您可以设置最大宽度,根据此线程中讨论的算法计算列数:
http://sibirjak.com/osflash/projects/as3commons-ui/layouts/showcase/#a6-dyntable
编辑:
要修改框的数量,请打开示例闪光窗口底部任务栏中的框窗口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.