arrays - 矩形阵列的最小分割成常数值的矩形子阵列
问题描述
令 A 是一个 MxN 矩阵,其条目 a_ij 在 {0, ..., n-1} 中。
我们可以将 A 中的条目视为已着色的矩形网格。
我有兴趣将每个彩色区域划分为矩形,这样可以最大限度地减少矩形的数量。也就是说,我想产生 n 组四元组
L_k = {(i, j, w, h) | a_xy = k forall i <= x < i + w, j <= y < j + h}
满足每个 a_ij 恰好属于一个矩形且所有矩形都不相交的条件。此外,总和 L_0 + ... + L_(n-1) 被最小化。
显然,最小化每个 L_k 可以独立完成,但也要求这发生得非常快。假设这是一个实时应用程序。可能的情况是,由于集合是不相交的,在 L_ks 之间共享信息比并行执行所有事情更快。n 可以很小(例如,<100),M 和 N 可以很大。
我假设对此有一种动态编程方法,或者可能有一种方法可以将其改写为图形问题,但对我来说如何解决这个问题并不是很明显。
编辑:
我的意思似乎有些混乱。这是一张帮助说明的图片。
想象这是一个 10x10 矩阵,红色 = 0,绿色 = 1,蓝色 = 2。像这样绘制黑框,尽量减少框的数量。这里的输出是
L_0 = {(0,8,2,2),(1,7,2,1),(2,8,1,1),(4,5,4,2),(6,7,2, 2)}
L_1 = {(0,0,4,4),(4,0,6,2),(6,2,2,3),(8,8,2,2)}
L_2 = {(0,4,4,3),(0,7,1,1),(2,9,6,1),(3,7,3,2),(4,2,2, 4),(8,2,2,6)}
解决方案
立即要做的一件事是注意您可以将问题分成连接颜色区域的各个实例。从那里,文章中链接的帖子解释了如何使用最大匹配来构建最佳解决方案。
但这可能很难实现(根据你的 C 标签判断,更难)。所以我推荐以下两种策略之一:回溯或贪婪。
要进行回溯,您将对尚未覆盖的图块集进行递归(我认为这是有道理的,因为您已经列出了所有整数坐标。这会发生变化,但不会大量改变)。取最高的、最左边的未覆盖的瓷砖,并遍历所有可能包含它的矩形(其中只有 ~n^2 个,希望更少)。然后递归。
为了优化这一点,您将需要修剪。如果您已经看到了具有更好答案的解决方案,则一种简单的修剪方法是停止递归。这种修剪称为分支定界。
如果您只需要一个大概的答案,您也可以在回溯的早期退出。既然您提到了“实时应用程序”,那么如果您稍微偏离一下可能就可以了。
继续近似的想法,你也可以通过贪婪地选择你现在可以做的最大的矩形来做类似的事情。这实现起来很烦人,但可行。您还可以将其与递归结合起来并提前退出。
推荐阅读
- amazon-web-services - 如何在AWS公共的RDS数据库实例中连接,可访问性不起作用
- javascript - 如何在不丢失分辨率的情况下使 Canvas HTML 图片更大?
- haskell - 在两个函数的输入上解析错误 - Haskell
- javascript - 在 JS 或 jQuery 中执行关键帧动画
- unity3d - 如何从预制按钮调用函数?
- linux - 将基于列值的数据与来自另一个数据的列值子集并在 Bash 中合并
- c# - 如何使用 indexof 和 substring 在字符串中查找单词?
- javascript - css pdf:对溢出内容强制分页
- flutter - pdf 1.8.1 Flutter - 无法显示文档
- python - PySpark:获取 UDF 元组的第 n 个值