【问题标题】:Algorithm to slice into square matrix a matrix将矩阵切成方阵的算法
【发布时间】:2020-04-08 17:14:26
【问题描述】:

我正在寻找一种算法,它采用一个矩阵(实际上是一个复式数组)并返回一个矩阵数组: 是正方形(宽度 = 高度) 矩阵中的所有元素都具有相同的值。 我不知道这是否清楚,所以想象一下你有一个由红色、蓝色或绿色像素组成的图像,我想得到一个包含尽可能少的正方形的数组。如图所示

编辑:

好的,也许不清楚:我有一个元素网格,可以有一些类似的值:

0011121

0111122

2211122

0010221

0012221

那是我的输入,我想要输出类似的东西:

|0|0|111|2|1|

|0|1|111|22|

|2|2|111|22|

|00|1|0|22|1|

|00|1|2|22|1|

当每个 |X|是一个数组,它是输入数组的一部分。 我的目标是尽量减少输出数组的数量

【问题讨论】:

  • 为什么第一行有 |0|0|两个数组和第四行 |00|一个数组?我以为你是在对相似的字符进行分组。
  • 更新很好(与图片相同),一个选项是使用所描述的提示,您需要一个适当的分组算法(输出)。这是关于边界的一些工作,因为正方形会产生间隙...(一个正方形,是否还应检查间隙和间隙是否有可能的内部正方形...)
  • @SyedAfzal,第一行输出为 2 个数组 [0],[0] 因为是 1 x 1 的正方形(这是这里可能的最大正方形)。第四行输出(与第五行)为 1 个大数组 [[0,0][0, 0]] 因为在这里,可能的最大正方形是 2 x 2 正方形。
  • @TraianGEICU 感谢您的回答和提示。是的,间隙是该算法中的一个“问题”。你不知道可以解决我的问题的“分组”算法吗? (对于寻路,我们有 A*,...),但是是否有现有的算法可以解决这个问题?
  • 不知道是否有任何标准算法,但听起来更像是压缩。 30 年前遇到类似的事情,但输入是连续出现的数组....任何方式都可能进一步研究相似性是个好主意。

标签: java algorithm matrix


【解决方案1】:

这个问题似乎没有有效的解决方案。

考虑如下定义的问题实例的子集:

  • 矩阵元素只有 2 个值,例如 01
  • 仅考虑值为0 的矩阵元素。
  • 用左下角坐标为(i, n-j)的矩形二维网格中的单位正方形标识每个矩阵元素m_ij
  • 以这种方式选择的单位正方形集合SU必须是“连通的”,并且不能有“孔”;形式上,对于每一对单位正方形(m_ij, m_kl) \in SU^2: (i, j) != (k, l),有一个q+1单位正方形的序列<m_ij = m_i(0)j(0), m_i(1)j(1), ..., m_i(q)j(q) = m_kl>,使得(|i(r)-i(r+1)| = 1 _and_ j(r)=j(r+1)) _or_ (i(r)=i(r+1) _and_ |j(r)-j(r+1)| = 1 ); r=0...q(序列中相邻的单位正方形共享一侧),并且所有单位的集合SUALL具有整数减去SU 的左下角坐标的正方形也是“连接的”。

将允许这种构造的矩阵分割成最小数量的正方形子矩阵,相当于将包含SU(这是SU的所有元素的并集)的最小正交多边形平铺成最小数量的正方形。

This SE.CS post 给出的参考资料(和一个证明)表明这个问题对于平铺集正方形的整数边长是 NP 完全的。

请注意,根据同一篇文章,平铺成矩形是在多项式时间内运行的。

【讨论】:

    【解决方案2】:

    一些提示可能有用。

    对于简化矩阵的表示,也许向量更好,因为它需要存储(start_x,start_y,value ...不确定另一个矩阵是否非常有用)。

    第 1 步:在 x 上循环 n 次(从 y=0 开始)
    第 2 步:循环 y 次/直到 n 次出现。这里的大多数情况是 m lees 然后 n。 (情况 m 大于 n 排除,因为不能做平方)很好,只保留最小值 [m]
    第 3 步:在向量上标记 (start_x,start_y, value)
    从 x=m 重复步骤 1-3 直到结束 x
    步骤4:结束x,从找到的最left_x开始调整y(m-in向量,repeat向量)。 ...
    继续直到矩阵结束。

    需要非常小心边界的制作方式(正方形),以便在结果中包含初始矩阵的完整覆盖。
    重构完整初始矩阵可以完全从结果向量重构。
    (需要找到间隙并将其放置在从 step_4 派生的向量上)

    注意!这不是一个完整的解决方案,也许是如何开始并弄清楚每个步骤要调整的内容。

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 1970-01-01
      • 2013-05-08
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多