【问题标题】:grouping into rectangles on a binary grid在二进制网格上分组为矩形
【发布时间】:2025-12-20 23:45:10
【问题描述】:

我有一个表示要更新的纹理像素的二进制网格。 上传这些像素的成本大致可以分为固定部分(类似于某些协议中的标头)和由上传大小决定的动态部分。两者都依赖于系统,但可以测量。

这意味着成本来自固定成本(传输开销)始终相同的每个矩形。

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

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

我正在寻找一种算法,它可以计算覆盖所有标记为要更新的单元格的矩形,同时最小化总成本。

矩形可能重叠。

因为计算这些矩形的成本加起来就是总成本,我正在寻找一种高效但不完美的算法,尽管很高兴听到完美的解决方案以及它是否是 NP 完全的。

目前,我不知道如何最好地解决这个问题,只有一种模糊的感觉,也许 kd-trees 可以提供帮助。

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

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

【问题讨论】:

  • 目前还不清楚——你能添加一些例子来解释这一切吗?
  • @Dukeling 我添加了一些示例图片。
  • 我仍然很难理解成本。固定成本是一次性的(网格)还是每个矩形一次?动态部分是否与发送的单元格数量成线性比例(在所有矩形上)(例如,每个单元格 2 个单位,因此 2x2 将花费 2*4=8 个单位,而 5x5 和 3x3 矩形将花费 2*(25+ 9)=68 个单位) 还是有其他缩放比例?您是否正在寻找一种旨在最小化任何给定固定成本和动态成本的总体成本的算法,或者您是否有一些成本并且您只是在寻找针对这些特定成本的算法?
  • @Dukeling 好点!我试图相应地更新问题。

标签: algorithm grid


【解决方案1】:

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

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

【讨论】: