algorithm – 将基于单元格的形状划分为最小量矩形的最佳方法

假设一个布尔数组,如:

1111
1111
1110
1111
1001

现在你需要找到安排任何尺寸的最小矩形来实现这种形状的方法.所以,例如,你会发现:

+-++
| |+
| |
+-++
+  +

矩形的一角和|, – 矩形的边框在哪里.

我想做的是从最大可能的矩形开始,检查数组中是否有任何可以放置的位置,矩形覆盖的每个数组元素都是真的.如果存在这样的位置,矩形将被添加到列表中.然后我们检查数组的左侧空间是否有另一个点放入矩形,然后减小矩形的大小并用剩余空间重复该过程,直到大小为0.

这应该会产生很好的结果,因为我们总是从大的矩形开始,我们当然可以使用更少的,这反过来意味着我们使用少量的矩形.

然而,这只是我想到的一个概念,还没有付诸实践.它看起来效率很低,所以我想知道是否有任何已知的快速算法来实现这一目标?

最佳答案
我真的很想到这个问题,所以我研究了已发表的研究.事实证明,如果你想要一个最佳的解决方案,这是一个非常难以解决的问题(NP-Hard,如果你想要技术).如果您不想接受我的话,请查看信息和控制中的“用于覆盖带有矩形的多边形的算法”.本文中有许多有趣的想法,作者给出了一种寻找最佳覆盖的算法.显然它不是在多项式时间内运行,但对于你的大小的问题实例来说它可能足够快.您甚至可能想先尝试一种更简单的耗尽技术,看看它是否适用于您感兴趣的问题.

这是我最初的建议,我不再保证是最佳的,尽管我还没有提出反例:

从一个名为R的矩形空集合开始.对于数组中值为1的每个位置(i,j),找到包含(i,j)的最宽矩形W 1s,然后添加W,然后将W扩展到矩形最大高度M将包含所有1.如果不存在,则将M添加到集合R.完成后,对R进行传递并删除R中其他矩形完全覆盖的任何矩形.

转载注明原文:algorithm – 将基于单元格的形状划分为最小量矩形的最佳方法 - 代码日志