描述和分析找到最大面积矩形的算法 模式在给定的位图中出现多次。具体来说,给定 输入的二维二维数组M [1 .. n,1 .. n],您的算法 应该输出M中最大的重复矩形图案的面积。 例如,给定下图左侧所示的位图,您的 算法应返回整数195,即15 x 13的面积 狗狗。 (尽管在此示例中没有发生,但是 重复的模式可能会重叠。) 图片: enter image description here
答案 0 :(得分:0)
使用术语矩形而不是子矩阵。
蛮力方法 O(n^8)
在矩阵中取两个不同的位置 A 和 B。然后考虑矩阵中以 A 为左上角的所有矩形。同样考虑所有以 B 为左上角的矩形。假设我们有一个矩形,左上角A长l,宽b,然后取左上角B对应的矩形,长l, 呼吸 b (假设这两个矩形都存在)。如果两个矩形的每一位都匹配,那么我们有一个 lb 重复的面积模式,如果 lb 大于之前看到的最大面积,则更新最大面积。
对所有 A 和 B 对重复此过程。
时间复杂度: 在不使分析复杂的情况下,让我们假设对于矩阵中的每个点 P,对于所有以 P 为左上角的矩形,矩形可能的最大长度为 n< /em>(但事实并非如此,例如考虑矩阵的最后一行和最后一列中的点)。让我们对矩形的最大可能呼吸做类似的假设。
然后从乘积规则计算,有n^2个可能的矩形,以点P为左上角。
这个估计还不错,因为根据这个,总共有 n^4 个可能的矩形,因为矩形中有 n^2 个点,我们每个点有 n^2 个矩形。
实际答案是 ( (n+1) 选择 2 ) * ( (n+1) 选择 2 ),其顺序为 n^4
所以总的来说,对于每一对,我们将比较 n^2 个矩形。和上面类似,让我们估计每个矩形中有n^2个点,以便于计算。因此,对于一对点 A 和 B,我们将进行 O(n^4) 次比较,因为对于每个矩形,我们需要检查它们的所有对应点。
总共有 ( n^2 选择 2 ) 对点,它们的阶数为 n^4。所以我们的整体时间复杂度为 O(n^8)。
避免重复计算 O(n^6)
我们看到我们一次又一次地反复检查同一区域。例如,考虑两个左上角分别位于 A 和 B 的矩形,长度为 l,宽度为 b .再次,当我们检查另一个对应的矩形,其左上角位于 A 和 B,长度 (l+1) 和宽度 b ,我们再次检查长l和宽b的矩形。
所以我们使用记忆化来避免重复计算。
假设矩形的长度是水平测量的,而宽度是垂直测量的。
考虑长 l+1 和宽 b 的矩形,左上角位于 A 和 B。现在我们需要比较矩形中对应点的所有值是否匹配。 A_r, B_r 分别指向 A 和 B 的右侧。然后,如果矩形对于所有对应点具有相同的值,则矩形的长度为 l,宽度为 b 且具有左上角A 和 B 必须重复。同样,长 l 和宽 b 的矩形,左上角位于 A_r 和 B_r 必须匹配。
考虑下图:
时间复杂度 通过上述过程,比较两个矩形需要 O(1) 时间。因此,与上述情况相比,时间复杂度降低了 n^2 倍(这是在早期情况下比较矩形所需的时间)。所以在这种情况下 O(n^6) 时间。
让我们将 (P, m, n) 表示为左上角为 P、长度为 m、宽度为 m 的矩形。
去除不必要的计算 O(n^5)
在上面的方法中,即使我们知道如果矩形 (A, l, b) 和 (B, l, b) 不匹配,我们也会再次比较矩形 (A, l+1, b) 和 (B, l+ 1、乙)。
所以假设现在我们有左上角 A 和 B 的长度分别为 l 的矩形,那么矩形的最大可能宽度是多少?
如果每个矩形顶行的所有对应元素都不匹配,则答案为 0。但如果所有对应行都匹配,则答案为 1 + (max.breadth of rectangles of length l 但左上角位于 A 和 B 下方)。
与上述方法类似,此计算将花费 O(1) 时间,因为我们需要 (A, B, l-1) 的宽度以及以下长度为 l 的矩形的宽度。
请参阅此答案 Largest Square Block 以获得更清晰的信息。
时间复杂度 对于矩阵中的每一对点,我们必须存储最大值。长度 1, 2, ...n 的宽度。并且有 n^4 个这样的对。我们可以检查在 O(1) 时间内获取每个值。所以总的时间复杂度是 O(n^5)。并找到最大值。每对矩形的每个长度的面积在这里很明显。
进一步优化 O(n^4)
假设您有两个位图副本。一个粘在地上,另一个可以在粘着的上面移动。让我们把固定的一个称为基础,另一个称为移动位图。
现在移动位图的左上角可以位于基的 (n^2 - 1) 个点之一上,除非移动位图位于基的顶部。现在在每种情况下,都有一些点被遗漏了,即对于基础位图上的一些点,不会有一个点在它上面移动,反之亦然。假设移动位图的左上角需要在其下方有一个基本位图元素。
现在采用这些 (n^2 - 1) 配置的一个实例。对于移动位图上的所有点,其下方有一个基本位图点,让我们构造一个新矩阵,如果两个位图的顶部和底部元素相同,则它包含“Y”,否则它将包含“N” .请记住,矩阵的大小与移动位图上的元素数量相同,这些元素下方有一个基本位图元素。
然后,基本位图和移动位图的那部分重复图案的最大区域将是包含所有 Y 的最大实心块区域,这可以在 O(n^2) 时间内完成。
我们需要的答案是所有这些 (n^2 - 1) 配置中的最大答案。
请参阅 Largest rectangle containing all Y's 以进一步了解
时间复杂度 对于每个配置,构建新的“Y”和“N”矩阵需要 O(n^2) 时间,最大面积计算也需要 O(n^2) 时间. 并且有(n^2-1)个这样的配置,所以总体O(n^4)时间。
注意 Jeff Erickson 表示可以在 O(n^3 polylog n) 时间内计算出答案。我不知道该怎么做。如果有人发布这样的算法就好了。