Algorithm 如何将大小相等的正方形网格减少为一组最小的矩形?
如果我有一个由大小相等的正方形组成的任意大小的网格(它们之间没有间距),我需要知道一种有效的方法来将它们减少为最小数量的矩形,例如,如果每个星号代表一个正方形,那么可以将其减少为一个大矩形:Algorithm 如何将大小相等的正方形网格减少为一组最小的矩形?,algorithm,grid,Algorithm,Grid,如果我有一个由大小相等的正方形组成的任意大小的网格(它们之间没有间距),我需要知道一种有效的方法来将它们减少为最小数量的矩形,例如,如果每个星号代表一个正方形,那么可以将其减少为一个大矩形: ***** ***** ***** 虽然这可以简化为两个矩形: *** *** ***** => **(1) ***(2) ***** ** *** *** *** 一个明显的解决方案是收集每行中的相邻方块,然后收集相
*****
*****
*****
虽然这可以简化为两个矩形:
*** ***
***** => **(1) ***(2)
***** ** ***
*** ***
一个明显的解决方案是收集每行中的相邻方块,然后收集相同的相邻行。对于我的第二个例子,这将找到三个矩形,这不是最优的
*** (1)
***** (2)
*****
*** (3)
我想知道是否有一种更成功、更高效的算法可以做到这一点。我不知道是否有一种算法可以做到这一点,所以我编了一个: 求(xmin,ymin)(xmax,ymax),即现有正方形的x和y坐标的最小值和最大值。这将定义一个包围所有正方形的边框 查找并连接边界矩形内的直线凹角 对评论的回答:好的,如果我们沿着网格线连接所有的凹面周界角,逐渐移除(标记)周界矩形,我们在上述困难的示例中得到以下结果:
A
XBB
CCCX
XDD
X
EFFFG
I J
I J
正如已经正确指出的那样,这是次优的。当可能有多种方式时,需要做出一些决定,以便成对连接凹面。选择新矩形数最少的一个。(见最低X下的F)
分割完成后,我们现在添加另一个扩展(合并)现有矩形的阶段。至关重要的是,只有这样的合并是允许的,不会减少任何现有的矩形。将最上面的X更改为B将是不允许的更改,因为Xs矩形已缩小。此条件保证仅在朝向最小矩形数的方向上进行更改。在上述示例上继续此过程,我们得到:
X
XBB
CCCX
XDD
X
FFFFF
I J
I J
在本例中,这恰好是最优的,但一般来说,您可能必须使用这些操作进行状态空间搜索,以找到全局最小值。我直觉认为这个问题可能很复杂。。。例如,考虑
*
***
****
***
*
最优解为4
B
BCC
AAAB
BDD
B
但我并没有找到一个简单的方法来通过局部推理预测A应该在最后一个方块之前停止。在最优解中,A、C和D是非最大矩形,只有B是最大矩形。事情可能变得更加复杂,例如:
*
***
****
***
*
*****
* *
* *
最佳解决方案是什么
B
BCC
AAAB
BDD
B
EEEEE
F G
F G
其中只有E是最大的。此外,在最优解中,除了一个矩形外,所有矩形都是非最大的,这看起来很容易建立任意大的问题。
当然,这并不意味着IMO不存在简单的解决方案。。。就像我说的,这是一种直觉,但我认为,如果需要绝对最小值,任何用最大矩形推理的解算器都会有问题
对于一个类似但又不同的问题(我搜索的是一个包含不一定不相交的圆盘的最小覆盖),我使用了一种缓慢的贪婪方法,总是将包含的圆盘添加到解决方案中,并覆盖大多数尚未覆盖的正方形。
对于您的问题,我可能会看到它是如何工作的每次添加最大的包含矩形。。。正如上面的例子所示,这通常不是一个最佳的解决方案。试试谷歌搜索“最小矩形覆盖”。因为你在网格上工作,我想旋转90度是允许的。那么,从一个方向开始,执行您声明的算法如何。这将给出(1)、(2)和(3),就像你在例子中所说的那样。旋转90度。重复你的算法。您将得到(1)和(2)。这是启发性的……不确定它是否是最优的。@Bart试过了,但这是所有想要的money@Tryer“我同意启发式,但我希望有比这更好的解决方案。”彼得韦斯特:你能告诉我们最大网格大小的估计值吗?(用星号单位!)你能举个简单的例子吗?我不太明白这个逻辑。这个导致了一个矩形分区。。。但不是一个最小的。谢谢,我猜这将是一个不平凡的解决。我正在考虑一个类似的解决方案,但寻找一些聪明的数学解决方案。