Java 一种分割成方阵的算法
我正在搜索一个算法,该算法获取一个矩阵(实际上是一个双条目数组),并返回一个矩阵数组,该矩阵: 是正方形(宽度=高度) 矩阵中的所有元素都具有相同的值。 我不知道这是否清楚,所以假设你有一个由红色、蓝色或绿色像素组成的图像,我想得到一个包含最小可能平方的数组。如图所示 编辑: 好的,可能还不清楚:我有一个元素网格,它可以有这样一些值: 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 |都是作为输入数组的一部分的数组时。Java 一种分割成方阵的算法,java,algorithm,matrix,Java,Algorithm,Matrix,我正在搜索一个算法,该算法获取一个矩阵(实际上是一个双条目数组),并返回一个矩阵数组,该矩阵: 是正方形(宽度=高度) 矩阵中的所有元素都具有相同的值。 我不知道这是否清楚,所以假设你有一个由红色、蓝色或绿色像素组成的图像,我想得到一个包含最小可能平方的数组。如图所示 编辑: 好的,可能还不清楚:我有一个元素网格,它可以有这样一些值: 0011121 0111122 2211122 0010221 0012221 这是我的输入,我想在输出中做一些类似的事情: |0 | 0 | 111 | 2 |
我的目标是尽量减少输出数组的数量一些提示可能有用。
对于简化矩阵的表示,可能向量更好,因为它需要存储(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^2:(i,j)!=(k,l)有一个由SU
单位平方组成的序列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年前遇到类似的情况,但输入为连续出现的数组。。。。无论如何,也许进一步研究相似性是个好主意。