较大矩阵中的最大相等子矩阵

Posted

技术标签:

【中文标题】较大矩阵中的最大相等子矩阵【英文标题】:Largest equal submatrices in bigger matrix 【发布时间】:2014-03-19 00:24:39 【问题描述】:

假设您有一个高度为 h 和宽度为 w (h,w

【问题讨论】:

等于表示子矩阵中的每个元素都相同? 矩阵中元素的类型呢?这些数字是数字还是可以是字符/字符串? 子矩阵应该是最大的吗?如果没有,那很容易,你可以检查是否有两个元素具有相同的项目。 @notbad 在标题中,但不在问题文本中 子矩阵是否需要不重叠? 【参考方案1】:

有一种算法比 O(w2h2) 更好。让我们先考虑一个更简单的版本。给定一个只有小写字母的矩阵M,找出矩阵中的最大子串。这个问题等于在M[0]$1M[1]...M[w-1] 中找到longest common substring,我们在M[i]M[i+1] 之间添加不同的特殊字符。使用suffix array,最长公共子串问题可以在线性时间内解决,对于这种情况,它可以在 O(wh) 中解决。

对于最大子矩阵问题,可以通过枚举所有可能的高度 ll 的两个子串的字典序可以继承自高度l-1

正如@Niklas B 解释的那样。在第一次迭代中,我们使用后缀数组对矩阵的行后缀进行排名。然后在第二步中,我们使用基数排序并重用在第一次迭代中计算的排名,对相邻 2 行组合的后缀进行排名。第三步,我们对相邻 3 行的后缀等进行排序。我们还可以为每次迭代维护LCP arrays,这样我们就可以使用单次遍历找到出现两次的最长子字符串。

总的来说,这个算法是O(h2w)的线性时间后缀数组构造算法。

【讨论】:

对不起,我的英语不好,你能看懂第一部分吗? 是的,我开始明白你说的第二段是什么意思了,但是有点难以理解。 我现在明白了。非常酷的想法,但仅从您的回答就真的很难理解:/ 是的,所以在第一次迭代中,我们使用后缀数组对矩阵的行后缀进行排名。然后在第二步中,我们对相邻 2 行组合的后缀进行排名,可能使用基数排序与第一次迭代的排名。第三步,我们对相邻3行的后缀等进行排序。这样对吗? 当然,随意。为您 +1,这绝对是一个更好的解决方案,OP 应该考虑接受这个【参考方案2】:

你可以在O(hw)中枚举所有向量(-h 。对于每个这样的向量,将矩阵转换为向量 (dh, dw) 并从原始矩阵中减去转换后的矩阵。在它们重叠的范围内,您想找到面积最大的零矩形。您可以使用a linear time algorithm 来执行此操作。

运行时间:O(w2h2)

更实用的方法是散列所有子矩阵并以这种方式检查重复项。这将具有相同的预期运行时间。

【讨论】:

h,w @JuanLopes:我不知道,据我估计它可能会在一分钟内运行。在比赛中这肯定会太慢,但也许不是那种问题 我在比赛之外没有看到很多像“高 h 宽 w (h,w @Juan Me 也没有。看看是否有这个的二次算法会很有趣 关于散列子矩阵的想法似乎对我的问题有好处,但我不知道如何散列它。

以上是关于较大矩阵中的最大相等子矩阵的主要内容,如果未能解决你的问题,请参考以下文章

NXM 矩阵的所有 AXB 子矩阵中的最大元素

最大子矩阵和

稀疏矩阵中的最大和子矩形

最大子矩阵和 题解

[SCOI2005] 最大子矩阵

codevs 1259 最大正方形子矩阵 WD