假设您有一个高度为h且宽度为w的矩阵(h,w <= 500)您必须找到相同大小的两个相等的子矩阵。有什么想法解决?
答案 0 :(得分:2)
有一种比O更好的算法(w 2 h 2 )。让我们先考虑一个简单的版本。给定只有小写字母的矩阵M
,找到矩阵中的最大子字符串。此问题等于在M[0]$1M[1]...M[w-1]
中找到longest common substring,我们在M[i]
和M[i+1]
之间添加了不同的特殊字符。使用suffix array,最长的公共子串问题可以在线性时间内求解,对于这种情况,它可以用O(wh)求解。
对于最大的子矩阵问题,可以通过枚举所有可能的高度l&lt; = h来减少子字符串问题,同时,高度为l
的字典顺序两个子字符串可以继承高度为l-1
的子字符串。
@Niklas B解释道。在第一次迭代中,我们使用后缀数组对矩阵的行后缀进行排名。然后在第二步中,我们使用基数排序和重复使用在第一次迭代中计算的排名来对相邻的2行组合的后缀进行排名。在第三步中,我们对相邻的3行等的后缀进行排序。我们还可以为每次迭代维护LCP arrays,以便我们可以使用单次传递找到出现两次的最长子字符串。
总的来说,这个算法是 O(h 2 w),带有线性时间后缀数组构造算法。
答案 1 :(得分:0)
您可以在 O(hw)中枚举所有向量( - h&lt; dh&lt; h,0&lt; = dw&lt; w)。对于每个这样的矢量,通过矢量(dh,dw)转换矩阵,并从原始矩阵中减去转换后的矩阵。在它们重叠的范围内,您希望找到具有最大面积的零的矩形。您可以使用a linear time algorithm来执行此操作。
运行时: O(w 2 h 2 )
更实用的方法是散列所有子矩阵并以这种方式检查重复项。这将具有相同的预期运行时间。