Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何将大小相等的正方形网格减少为一组最小的矩形?_Algorithm_Grid - Fatal编程技术网

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“我同意启发式,但我希望有比这更好的解决方案。”彼得韦斯特:你能告诉我们最大网格大小的估计值吗?(用星号单位!)你能举个简单的例子吗?我不太明白这个逻辑。这个导致了一个矩形分区。。。但不是一个最小的。谢谢,我猜这将是一个不平凡的解决。我正在考虑一个类似的解决方案,但寻找一些聪明的数学解决方案。