Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一种分割成方阵的算法_Java_Algorithm_Matrix - Fatal编程技术网

Java 一种分割成方阵的算法

Java 一种分割成方阵的算法,java,algorithm,matrix,Java,Algorithm,Matrix,我正在搜索一个算法,该算法获取一个矩阵(实际上是一个双条目数组),并返回一个矩阵数组,该矩阵: 是正方形(宽度=高度) 矩阵中的所有元素都具有相同的值。 我不知道这是否清楚,所以假设你有一个由红色、蓝色或绿色像素组成的图像,我想得到一个包含最小可能平方的数组。如图所示 编辑: 好的,可能还不清楚:我有一个元素网格,它可以有这样一些值: 0011121 0111122 2211122 0010221 0012221 这是我的输入,我想在输出中做一些类似的事情: |0 | 0 | 111 | 2 |

我正在搜索一个算法,该算法获取一个矩阵(实际上是一个双条目数组),并返回一个矩阵数组,该矩阵: 是正方形(宽度=高度) 矩阵中的所有元素都具有相同的值。 我不知道这是否清楚,所以假设你有一个由红色、蓝色或绿色像素组成的图像,我想得到一个包含最小可能平方的数组。如图所示

编辑:

好的,可能还不清楚:我有一个元素网格,它可以有这样一些值:

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 |都是作为输入数组的一部分的数组时。
我的目标是尽量减少输出数组的数量

一些提示可能有用。

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

步骤1:在x上循环n次(从y=0开始)
步骤2:在y上循环,直到出现n次。这里的大多数案例都是m级,然后是n级。 (不包括m大于n的情况,因为不能做平方)好的,只保留最小值[m]
步骤3:在向量上标记(开始x、开始y、值)
从x=m重复步骤1-3,直到x结束
第4步:结束x,从最左边的x开始调整y(m-in向量,重复向量)。 ...
一直走到矩阵结束。

需要非常小心边界是如何形成的(正方形),以便在结果中包含初始矩阵的完整覆盖。
从结果向量可以精确地重新构造完全初始矩阵。
(需要找到间隙并将其放置在从步骤4导出的向量上)


注意!这不是一个完整的解决方案,可能是如何开始并在每个步骤中找出需要调整的内容。

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

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

  • 矩阵元素只有两个值,即
    0
    1
  • 仅考虑值为
    0
    的矩阵元素
  • 用矩形二维网格中的单位正方形标识每个矩阵元素
    m_ij
    ,其左下角具有坐标
    (i,n-j)
  • 以这种方式选择的单位正方形集
    SU
    必须“连接”,且不得有“孔”;形式上,对于SU^2:(i,j)!=(k,l)有一个由
    q+1
    单位平方组成的序列
    (|i(r)-i(r+1)|=1|u和|j(r)=j(r+1))|u或|i(r)=i(r+1)| u和|j(r)-j(r+1)|=1);r=0…q
    (序列中相邻的单位平方共用一侧),并且所有单位平方的集合
    SUALL
    与整数减去
    SU
    的左下角坐标也“连接”
将允许这种构造的矩阵切片为最小数量的方子矩阵,相当于将包围
SU
(它是
SU
的所有元素的并集)的最小正交多边形平铺为最小数量的方子矩阵

给出的参考文献(和一个证明)表明,对于平铺集的平方的整数边长,该问题是NP完全问题


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

为什么第一行有两个数组| 0 | 0 |和第四行有一个数组| 00 |?我以为你是在分组相似的字符。更新很好(和图片一样),一个选项是使用所描述的提示,你需要一个合适的算法来分组(输出)。这里有一点关于边界的工作,因为正方形产生了间隙。。。(一个正方形、do gaps和gaps也应检查是否存在可能的内部正方形…@SyedAfzal,第一行作为2数组[0],[0]输出,因为它是1乘1的正方形(这里可能是最大的正方形)。第四行(第五行)输出为1个大数组[[0,0][0,0]],因为这里最大的正方形可能是2乘2的正方形。@谢谢您的回答和提示。是的,在这个算法中,间隙是一个“问题”。难道你不知道一个“分组”算法可以解决我的问题吗?(对于寻路,我们有一个*,…),但有没有一个现有的算法可以解决这个问题?不知道是否有任何标准算法,但它听起来更像是压缩。30年前遇到类似的情况,但输入为连续出现的数组。。。。无论如何,也许进一步研究相似性是个好主意。