最大尺寸矩形

2025年3月17日 | 阅读 8 分钟

全为 1 的最大尺寸立方体双子矩阵是一个经典的计算机科学和算法编程问题,它涉及在双矩阵(仅由 0 和 1 组成的矩阵)中改变最大的块状子矩阵,其中所有元素都为 1。当应用于直方图时,此问题也称为“最大直方图面积”问题。接下来,将简要介绍该问题及其重要性。

问题陈述

给定一个双矩阵,任务是在矩阵中找到一个最大的立方体,其中所有元素都为 1。立方体必须由连续的行和列组成。

示例

考虑以下二进制矩阵

全为 1 的最大尺寸矩形二进制子矩阵是

该矩形的面积为 5。

意义

此问题在各种操作中至关重要,包括图像处理、计算机视觉和数据库系统。它经常用于有效地描述二进制图像中最大的连通区域,或找到直方图中最大的块状面积等操作。

方法

有效地处理此问题需要优化算法。一种常见的方法是使用动态规划,并维护一个辅助矩阵来存储每个单元格处连续 1 的最大高度。通过这样做,您可以计算矩阵中每个单元格的最大面积,将其视为立方体的基座。

伪代码

  1. 初始化一个辅助矩阵来存储每个单元格处连续 1 的最大高度。
  2. 遍历双矩阵的每一行并更新辅助矩阵。
  3. 对于矩阵中的每个单元格,根据辅助矩阵计算以该单元格为终点的最大立方体面积。
  4. 在遍历过程中跟踪遇到的最大面积。

全为 1 的最大尺寸立方体双子矩阵问题是一个严谨而有趣的问题,它展示了算法优化在有效解决现实世界问题中的重要性。它结合了动态规划和矩阵操作的要素来找到最佳结果。

实现

如果给定了直方图条的高度,则可以设置直方图的最大面积。通过这种方式,可以在每一行中设置直方图的最大面积。要获得全为 1 的最大立方体,请更新下一行与上一行,然后找到直方图下的最大面积,即,将每个 1 视为填充的格子,将 0 视为空的院子,并将每一行视为基座。

图解

输入

步骤 1

0 1 1 0 最大面积 = 2

步骤 2

第 1 行 1 1 2 2 1 面积 = 4,最大面积变为 4

第 2 行 2 2 3 3 2 面积 = 8,最大面积变为 8

第 3 行 3 4 0 0 面积 = 6,最大面积保持为 8

算法

  1. 运行一个循环来遍历行。
  2. 现在,如果当前行不是第一行,则按如下方式更新该行:如果 matrix( i)( j) 不为零,则 matrix( i)( j) = matrix( i- 1)( j) + matrix( i)( j)。
  3. 找到直方图下的最大块状面积,并将第 i 行视为直方图条的高度。这可以在本文中计算:直方图中的最大矩形面积。
  4. 对所有行执行前两个步骤,并输出所有行的最大面积。

注意:强烈建议首先参考此文章,因为大部分代码都来自那里。

代码

输出

上述代码的输出是

MAXIMUM SIZE RECTANGLE

说明

提供的 Python 程序定义了一个名为 Solution 的类,该类解决了在双矩阵中更改全为 1 的最大立方体的问题。这是计算机科学中的一个常见问题,在图像处理、计算机视觉和算法设计中有应用。

该类有两个主要方法:maxHist 和 maxRectangle。maxHist 方法计算给定行表示的直方图的最大面积。它使用堆栈来跟踪直方图中条形的索引。该算法遍历直方图的条形,将每个条形的高度与堆栈顶部的条形进行比较。如果当前条形较高或堆栈为空,则将当前条形的索引推入堆栈。如果当前条形较短,则算法计算以堆栈顶部条形为最低条形形成的立方体的面积。此过程一直持续到遇到更高的条形或堆栈变为空。最大面积因此得到更新。此方法以线性时间有效地计算直方图下的最大面积。

maxRectangle 方法将 maxHist 方法应用于双矩阵的每一行。它遍历行,根据其上方连续 1 的累积来更新每个单元格中的值。此过程有效地将双矩阵转换为直方图表示。对于每一行,它还调用 maxHist 方法来查找直方图的最大面积。总结果会与所有行获得的最大面积进行更新。

驱动代码初始化一个双矩阵 A,并创建 Solution 类的实例(ans)。它还打印通过在矩阵上调用 maxRectangle 方法获得的结果。在给定的示例矩阵 A 中,全为 1 的最大立方体由第二行和第三行组成,面积为 8。程序的输出是“最大立方体的面积是 8。”

这种算法方法很有效,其时间复杂度为 O( m * n),其中 m 和 n 是矩阵的维度。该算法有效地利用堆栈数据结构来避免不必要的计算,并有效地计算双矩阵中的最大立方体面积。理解和实现此类算法对于解决与数据结构和计算思维相关的问题至关重要。

并发症

时间复杂度

  1. maxHist 方法仅遍历行中的每个元素一次,使用 while 循环。在最坏的情况下,它遍历所有元素一次,时间复杂度为 O( n),其中 n 是行中元素的数量。
  2. maxRectangle 方法遍历每一行(m 行),对于每一行,它调用 maxHist 方法,该方法需要 O( n) 时间。因此,总时间复杂度为 O( m * n),其中 m 是行数,n 是行中元素的数量。

空间复杂度

  1. maxHist 方法使用堆栈来存储索引。在最坏的情况下,当所有元素按递减顺序排列时,堆栈可以存储所有索引,空间复杂度为 O( n),其中 n 是行中元素的数量。
  2. maxRectangle 方法使用额外的空间来存储结果和修改后的双矩阵。结果所需的空间是常数,修改后的矩阵所需的空间也为 O( m * n),其中 m 是行数,n 是行中元素的数量;因此,总空间复杂度为 O( maximum( m, n))。

总而言之,给定代码的时间复杂度为 O( m * n),空间复杂度为 O( maximum( m, n))。该算法很有效,并且性能良好,特别是考虑到它旨在解决的问题的性质。

结论

该算法采用动态规划方法,将双矩阵的每一行视为一个直方图。它遍历每一行,更新连续 1 的高度,并使用基于堆栈的方法计算最大立方体面积。通过逐行应用此过程,该算法确定了双矩阵中的最大尺寸立方体。

时间复杂度为 O( m * n),其中 m 是行数,n 是矩阵的列数。该算法有效地一次处理矩阵的每个元素,从而得到线性时间结果。

空间复杂度为 O( maximum( m, n))。该算法使用堆栈进行中间计算,并且修改后的矩阵所需的空间与行数或列数的最大值成正比。

该算法有效地解决了在双矩阵中更改全为 1 的最大立方体的问题。它在时间和空间效率之间取得了平衡,使其适用于需要重用大型矩阵的实际应用。堆栈的使用和动态规划原理使得实现清晰而简洁,从而提高了算法的整体效率。