繁体   English   中英

计算表格布局的最佳列数 - 仅给出表格宽度和矩形列表

[英]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 - 所有列宽度的最大允许总和

  1. 在寻找可能的解决方案(最后一个表)时,当总列宽超过MaxAllowedWidth时,请停止尝试添加新列。 在您的示例中,您应该停止第三步,不要尝试4,5,6列,因为3列已经占用了更多的空间。 请注意,在此步骤中,我们仅考虑第一行项目。

  2. 按相反顺序浏览上一步中收到的可能列号。 第一个适用的解决方案将是最佳的,因为它将具有最小可能的行数。

  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM