假设您有一个高度h和宽度w的矩阵(h,w < = 500)您必须找到两个相同大小相等的子矩阵。任何想法解决?大矩阵中最大的相等子矩阵
回答
可以枚举所有矢量(-h < DH <小时,0 < = DW<瓦特)在O(HW)。对于每个这样的矢量,通过矢量(dh,dw)来转换矩阵并从原始矩阵中减去转换后的矩阵。在它们重叠的范围内,您想要查找具有最大面积的零的矩形。您可以使用a linear time algorithm来做到这一点。
运行:O(w^^ h )
一种更务实的方法是哈希所有子矩阵和重复检查的方式。这将具有相同的预期运行时间。
h,w <= 500,O(w²h²)会花费太长时间,不是吗(至少对于编程竞赛标准来说)? –
@JuanLopes:我不知道,根据我的估计,它可能会在一分钟内运行。在比赛中,这肯定会太慢,但也许它不是那种问题 –
我没有看到很多像“高度h和宽度w(h,w <= 500)”外部比赛的陈述:P –
存在比O更好的算法(w h )。首先考虑一个更简单的版本。给定一个只有小写字母的矩阵M
,找到矩阵中的最大子字符串。这个问题等于找到longest common substring在M[0]$1M[1]...M[w-1]
,我们在M[i]
和M[i+1]
之间添加不同的特殊字符。使用suffix array,最长的公共子串问题可以在线性时间内解决,对于这种情况,它可以用O(wh)来解决。
对于最大子矩阵的问题,通过列举所有可能的高度升< = H,在同一时间它可以是减少了的子问题,词典顺序2子带高度l
可以由具有高度的子串的顺序继承l-1
。
正如@Niklas B解释。在第一次迭代中,我们使用后缀数组来排列矩阵的行后缀。然后在第二步中,我们使用基数排序并重新使用第一次迭代中计算出的等级来排列相邻2行组合的后缀。在第三步中,我们对相邻3行的后缀进行排序等等。我们还可以为每次迭代维护LCP arrays,这样我们就可以使用一次遍历找到出现两次的最长子字符串。
总的来说,这个算法是ø(H 2 瓦特)与线性时间后缀数组构造算法。
对不起,我可怜的英语,你能理解第一部分吗? –
是的,我开始看到第二段的含义,但有点难理解。 –
我现在明白了。非常酷的想法,但是真的很难从你的答案中理解:/ –
- 1. 矩阵中矩阵最大的方块
- 2. 最大的子矩阵,其中1和0的数目相等
- 3. 在较大的矩阵中删除相同的子矩阵。 Matlab
- 4. 矩阵中最大的行
- 5. 从给定的矩阵中找出最大矩阵和最小矩阵
- 6. 在大矩阵中找到矩阵
- 7. 找到最大的子矩阵算法
- 8. 矩阵阵列的最大部分
- 9. Matlab大矩阵
- 10. 矩阵运算,最大值
- 11. 在大型稀疏矩阵中查找所有矩阵的子矩阵
- 12. 矩阵(2D)中的子矩形的最大总和
- 13. 最大总和/面积子矩阵
- 14. 查找最大总和子矩阵
- 15. numpy矩阵的最大元素/大小?
- 16. 查找矩阵中的最大总和子=矩形
- 17. 稀疏矩阵中的最大总和子矩形
- 18. CUDA基本矩阵加 - 大型矩阵
- 19. 使用相关矩阵的大型稀疏矩阵上的PCA
- 20. 在OpenCV中使用子矩阵制作一个大矩阵
- 21. 如何创建矩阵是更大的矩阵的子集
- 22. 将子矩阵的值赋给较大的矩阵
- 23. 根据子矩阵规则更改大矩阵的元素
- 24. 矩阵中列的最大值?
- 25. R中矩阵的最大尺寸
- 26. Stata - 矩阵中的最大值
- 27. MATLAB中三维矩阵的最大值
- 28. c#矩阵中最大的点
- 29. 汇总大矩阵
- 30. 矩阵大小Java
等于意味着子矩阵中的每个元素都相同? – taocp
矩阵中元素的类型如何?这些数字或可以是字符/字符串? – Mohan
子矩阵应该最大吗?如果没有,这很容易,你可以检查是否有两个元素具有相同的项目。 –