在二进制网格上分组成矩形

时间:2017-06-13 20:59:51

标签: algorithm grid

我有一个表示要更新的纹理像素的二进制网格。 上传这些像素的成本可以粗略地划分为固定的(类似于某些协议中的标题)和由上载大小确定的动态部分。两者都是系统相关的,但可以测量。

这意味着每个矩形的成本都是固定成本(转移开销)总是相同的。

成本函数本身可能因系统而异;在大多数情况下,它最好用线性函数近似,如线方程f.e。 cost_per_rectangle = fixed_costs + dynamic_costs * rectangle_size,或short c = f + s * d。但很可能这个函数变成对数或指数,如c = f + s * log(d)或c = f + s * d ^(1 + some)。

以下是一些真实世界的测量结果,以线性和y-log图绘制,大小从2到1M,其中X是点数,Y是我们的时间:

upload performance

我正在寻找一种算法,该算法可以计算覆盖所有标记为更新的单元格的矩形,同时最大限度地降低总成本。

矩形可能重叠。

因为计算这些矩形的成本加起来总成本,我正在寻找一种有效但不完美的算法,尽管听到完美的解决方案是非常好的,如果它是NP-complete与否。

目前,我不知道如何做到最好,只有一种模糊的感觉,也许kd-trees可以提供帮助。

以下是示例网格可能结果的一些图像: four corner extreme

diagonal

L or X

overlapping

我使用对角线示例进行了一些尝试和错误测试,并通过比较所有可能尺寸的上传时间找到了对角线示例的最佳矩形大小。

1 个答案:

答案 0 :(得分:0)

假设某人在图片顶部画了很多矩形,矩形嵌套成矩形,但没有两个矩形重叠。您可以在树上使用动态编程来计算矩形的子集,以选择覆盖标记为更新的所有单元格。将嵌套视为树结构。从最开始工作,计算覆盖该节点下标记为更新的所有单元的每个节点的最小成本:它是该节点的子节点计算的成本之和或与之相关的单个矩形的成本。那个节点 - 以最小的为准。 (事实上​​,如果没有需要更新的单元格靠近边缘,你可以收缩那个单个矩形)

如何获得良好的树形结构?两个想到的。一种是四叉树分解,它递归地将每个大矩形分成四个较小的矩形,然后细分这些较小的矩形,依此类推。另一种是形成需要更新的单元格的最小生成树,可能使用曼哈顿距离,并将此树结构用作矩形树,每个节点都有一个足够大的矩形作为其后代的边界框