Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Arrays 查找仅包含1'的最大长方体;nxn二进制数组中的s_Arrays_Algorithm - Fatal编程技术网

Arrays 查找仅包含1'的最大长方体;nxn二进制数组中的s

Arrays 查找仅包含1'的最大长方体;nxn二进制数组中的s,arrays,algorithm,Arrays,Algorithm,给定一个nxn二进制数组(仅包含0或1),我们如何使用非平凡解,即在O(N^3)中获得最大的长方体 -- 这是同样的问题,但在一个更高的维度。 此外,在我的例子中,最大的矩形可以“穿过阵列的边缘”,即空间就像二维矩阵的圆环 对于二维阵列,如果条目为: 00111 00111 11000 00000 00111 “X”所描述的解决方案是 00XXX 00XXX 11000 00000 00XXX 我已经对一个NxN二进制数组进行了计算,并按照中的思想找到了O(N^2)中最大矩形问题的解决方案。

给定一个nxn二进制数组(仅包含0或1),我们如何使用非平凡解,即在O(N^3)中获得最大的长方体

--

这是同样的问题,但在一个更高的维度。 此外,在我的例子中,最大的矩形可以“穿过阵列的边缘”,即空间就像二维矩阵的圆环

对于二维阵列,如果条目为:

00111
00111
11000
00000
00111
“X”所描述的解决方案是

00XXX
00XXX
11000
00000
00XXX
我已经对一个NxN二进制数组进行了计算,并按照中的思想找到了O(N^2)中最大矩形问题的解决方案。 但我不知道如何将其应用于3D阵列

--

解决方案“穿过边缘”的3x3x3阵列示例:

解决办法应该是:

1XX
100
0XX

1XX
001
1XX

0XX
110
0XX
这里只有O(N^4)

假设您正在布尔长方体[N][N][N]中存储cubiod

boolarray2d[N][N];
对于(int x_min=0;x_min计算r(i,j,k):对于N2行中的每一行,计算所有非零元素的累积和,在找到零元素时重置它
  • 对K的各种值执行以下步骤,使用(或斐波那契搜索)查找最大结果
  • 计算c(i,j,k):对于每个N2列,计算r(i,j,k)>=k的所有元素的累积和,当找到r(i,j,k)
  • 对M的各种值执行最后一步,使用黄金分割搜索查找最大结果
  • 计算总和:对于第三坐标的每个N2值,计算c(i,j,k)>=M的所有元素的累积总和,当找到c(i,j,k) 数组的“交叉边”属性以一种明显的方式处理:迭代每个索引两次,并保持所有累积和不大于N

    对于多维情况,该算法具有O(ND logD-1n)时间复杂度和O(D*ND)空间复杂度


    优化到O(N3日志N) 算法的第4步为M设置了一个全局值。如果M的值是局部确定的,则可以排除该步骤(复杂性降低logn

    为此,应该改进步骤5。它应该维护一个双端队列(其头部包含本地值M)和一个堆栈(保留所有值M的起始位置,从队列中逐出)

    当c(i,j,k)增加时,它被附加到队列的尾部

    如果c(i,j,k)减小,则从队列尾部删除所有较大的值。如果它进一步减小(队列为空),则使用堆栈恢复“sum”值,并将相应的“M”值放入队列

    然后,如果这允许增加本地解决方案的值,则可以从队列头中删除几个元素(并将其推送到堆栈中)


    对于多维情况,这种优化会产生O(ND logD-2 N)复杂度。

    您的问题及其标题混淆了变量N的使用。如果您指的是数组的一维大小,则您可能在寻求O(N^3)算法,而不是O(N)算法。N的值是否有合理的限制(在数组一维大小的意义上)?在我看来,O(N^3)是不可能实现的。如果你对O(N^4)中运行的解决方案感兴趣,我可以描述它。@HighPerformanceMark:的确,它令人困惑,我编辑了我的帖子。我是说O(N^3)。一个合理的限制是N=150。@JarosławGomułka:您的解决方案非常受欢迎。但您为什么认为这是不可能的?另外,一个重要的限制是算法的灵活性,因为我希望它适用于4D数组。我最多希望将当前的解决方案扩展到2D。
    X坐标等于X_min和X_max
    ,X坐标不能在X_min和X_max之间吗?例如,假设(X_min请记住,此算法迭代(X_min,X_max)的所有组合。因此它也将迭代(x1+1,X_max)和(X_min,x1-1)这个案例并没有被遗漏。哦!我错过了那个陈述。+1,很好的解决方案。只是出于好奇,为什么解决方案错了?我似乎找不到任何测试案例。它扩展了用于在2d数组中查找面积的概念。在你的解决方案中,array2d包含整数(最大可能高度)而在我的程序中,array2d包含布尔值。这使得find2dArea更加复杂。我认为这使得find2dArea必须搜索最大的长方体:(.这个场景中的行和列到底是什么?你有这个算法的源代码我可以阅读吗?还是你自己提出的?你好!谢谢你的回答。我非常想更好地理解这个。这是你提出的算法还是你有参考资料?再次感谢!你的意思是这样说的吗像这样的方法只适用于寻找最大的立方体?或者,我错了吗?我不能让它适用于长方体。我想我明白你现在所做的。给定数字A和B。在O(N^3)时间内,对于3D数组中的每个单元(I,j,k),你找到最大的C,这样就有一个A乘以B乘以C的长方体,其右下角为1(i,j,k)。然后(不知何故)搜索产生最大盒子的A和B组合?我仍然不太明白如何只尝试对数^2(N)个A和B组合就可以做到这一点。
    1XX
    100
    0XX
    
    1XX
    001
    1XX
    
    0XX
    110
    0XX