我有一个3D数组。在这个数组中,我想找到可以组合在更大元素中的元素。矩形不能相互叠加。我希望首先找到最大的矩形,但先到先得也不会出错,特别是如果这样可以提高性能。
E.g。
1 0 0 0 1
0 0 0 0 0
0 0 0 0 1
1 1 0 0 1
将产生(因为3x3是可以找到的最大矩形;位置1,0到3,2 - zerobased ):
0 0 0
0 0 0
0 0 0
和(因为1x2是可以找到的下一个最大的矩形;位置0,1到0,2):
0
0
和(因为2x1是可以找到的下一个最大的矩形;位置2,3到3,3):
0 0
当然(左边是位置4,1;它不是更大但仍然需要使用)
0
作为更大的元素(我只需要了解零或者零)。目的是减少体素网的碰撞器数量。
我不知道这种算法的名称,我可能会发现自己如何做到这一点。
如果有人可以为我提供一些可行的信息,那就太棒了!
答案 0 :(得分:1)
对于2D情况,用于找到最大矩形的算法是“直方图下的最大矩形区域”。这是一个非常简单的O(n)算法,也讨论了 here 。
诀窍是可视化您的矩阵实际上可以作为n
长度m
的直方图进行处理 - 在每一行,从上到下,您有一个高度为{{1}的列}(在您的示例中将由数字1表示),或当前字符为0
时的高度为height[i-1][j] + 1
的列。因此,每一行都在0
中处理,总复杂度变为O(m)
。现在,因为你想要所有的矩形,而不仅仅是最大的矩形,你只需要调整算法“消耗”你满意的任何矩形,也就是说,每当你发现一个迷路O(n*m)
中断你的矩形时形成时,您可以“消耗”上面将停止的矩形,并确保其下方的其他位置将在高度0或1处重新启动,从而有效地设置1
。 (height[i-1][jbegin~jend] = 0
和jbegin
是在jend
行结束的矩形的开头和结尾,而您刚刚选择“使用”,因为它在第{{I}行被阻止1}})
对于3D情况,您必须了解直方图算法的工作原理,以便您可以开发自适应,但它应该基本上变成上述更复杂的版本,跟踪额外的坐标。这可能不是最简单的实现方法,但如果这是你需要的,它将产生最佳性能。