Arrays 子阵列分配

Arrays 子阵列分配,arrays,algorithm,logic,Arrays,Algorithm,Logic,我有一个数组,它用数字填充,因此它包含空元素和非空元素,实际上由几个数组组成。可能是这样的: 00x0x0x0-0x000000-0x00-0x000-0x000-0x00000 0 0 0 0 0 0 0 00 0x0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 00 x x x x x0 0 0 00 0 0 0 0 0x x x 0 0 “0”表示空元素 “x”表示非空元素 一个人很容易在这里找

我有一个数组,它用数字填充,因此它包含空元素和非空元素,实际上由几个数组组成。可能是这样的:

00x0x0x0-0x0
00
000-0x00-0x0
00-0x000-0x0
000
0 0 0 0 0 0 0 0 00 0x0 0 0 0
0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 00 x x x x x0 0 0 0
0 0 0 0 0 0x x x 0 0

“0”表示空元素
“x”表示非空元素

一个人很容易在这里找到3个子阵列,但我想知道如何使用程序找到它们。困难在于子阵列未满,即存在空元素。 是否有一种算法可以将初始阵列分割成子阵列,或者任何人都可以帮助我?


子阵坐标(x1,y1,x2,y2):{2,1,8,5}{11,2,14,7}{6,9,11,10}。同样以粗体突出显示,您可以通过使用联合查找数据结构在O(NM)时间内解决此问题。遵循以下步骤:

步骤1
:在矩阵中为相邻填充元素生成连续的水平线。并用不同的数字标记这些行

对于这个修改过的矩阵

0crmk_imk0 imk 0 imk 0 imk 00
0x鯹鯹x鯹00鯹鯹
00鰕鰕鰕000鰕鰕 0 0 0 0 0 0 0 0 0鰕鰕鰕
0 0 0 0 0 0 0 0 0
0 0 0 00 x x x0 0
0 0 0 0x x x 00 0 0

矩阵的不同行将变成:

011102200100
03 3 300 4 4
00550000666
0 0 0 0 0 0 07 7
0 0 0 0 0 0 0 0 0
0 0 0 00 8 8 80 0 0
0 0 0 09 9 00 0 0

Step2
:现在初始化Union Find数据结构,将所有不同的行作为数据结构中的单独集群/集合

步骤3
:开始迭代矩阵的所有列。每当遇到新行的开头时,请检查该行的正上方或正下方是否有行。如果在上面或下面存在这样一行,则合并与数据结构中相邻行对应的两个集合

Step4
:现在,在算法末尾有了所有不同的线簇,您可以轻松地计算簇的边界。因此,您拥有所有不同的子数组

运行时间:
O(NM)
考虑到我们使用加权快速联合查找数据结构,路径压缩为联合操作提供O(α(n))时间(其中α为)。因为逆阿克曼函数增长很慢,我把它当作常数

编辑:在这种情况下,所描述的算法将失败(如用户beaker在评论中所述)

1
203
0400

为了处理这些类型的情况,除了上面提到的数据结构之外,我们还将维护一个数组,该数组将包含每行占用的矩形。因此,当我们将第2行与第1行合并时,第2行的值将变为0…4,表示有一个矩形覆盖第二行的索引0到4。现在,当在步骤3中考虑第4行时,它将检查上面或下面的点是否被某个矩形覆盖。因此,它将合并4号线的集群和2号线的集群

算法的其他部分将保持不变,只是我们现在检查相邻点是否被某个矩形覆盖


我们为所有行维护的额外信息将增加运行时间。每当我们在STEP3中考虑矩阵列时,我们可能不得不做O(n)额外的功。因此,运行时间上升到O(N^2*M)

这个人也可以形成3个以上的子阵列。我的意思是,你是如何将数组划分成子数组的?是否存在与子数组数量和空元素数量相关联的成本函数?它们之间应至少有一个空行(列)。未定义和应计算中的子阵列数量。输入只是一个主数组m*n。可以对主数组中的空元素和非空元素进行计数。换句话说,输入是一个巨大的数组,具有我上面展示的结构,输出是一个数组(n,x1,x2,y1,y2),其中n是索引,x1,x2,y1,y2是子数组的坐标。对不起,输出应该是一个数组(n,1到4),其中n是子数组的索引,1到4是它的坐标x1,y1,x2,y2。问题仍然没有明确定义。“他们之间至少有一行空行”是什么意思?完整的空行或空列?还有,为什么不把整个矩阵都拿走呢?它还包含所有非零元素。优化目标是什么?最小面积?最大矩形数?这基本上是算法,只要您能确保所有非零元素都连接到其子阵列的其余部分,就可以正常工作。如果没有,您可能会错过子数组的行/列。我无法理解您的意思。我认为它将适用于所有测试用例。您是否有解决方案可能失败的测试用例?当然:row1=
1
;行2=
1001
;第3行=
001 0
。可能第3行只是它自己的子数组,但是如果水平复制这些行,那么第3行