Algorithm 方阵算法中的最小矩形曲面

Algorithm 方阵算法中的最小矩形曲面,algorithm,math,matrix,Algorithm,Math,Matrix,有人能给我指出一个解决以下问题的正确方法吗:我有一个平方矩阵(N*N),里面填充了0和1的值。我需要在矩阵中找到两个矩形,因此它们检查以下条件: 矩阵中1的每个元素必须包含在至少一个矩形中 两个矩形的曲面之和必须最小(允许其中一个矩形的曲面为0) 更具体地说,矩形是什么:矩形由两个区间[a1,b1],[a2,b2]定义,并包含所有矩阵单元(i,j),如a1≤我≤b1、a2≤J≤b2。为了更清楚表面的含义:(b1-a1+1)·(b2-a2+1) 你能帮我出点主意吗。非常感谢 编辑1:两个矩形可能重

有人能给我指出一个解决以下问题的正确方法吗:我有一个平方矩阵(N*N),里面填充了0和1的值。我需要在矩阵中找到两个矩形,因此它们检查以下条件:

  • 矩阵中1的每个元素必须包含在至少一个矩形中

  • 两个矩形的曲面之和必须最小(允许其中一个矩形的曲面为0)

  • 更具体地说,矩形是什么:矩形由两个区间[a1,b1],[a2,b2]定义,并包含所有矩阵单元(i,j),如a1≤我≤b1、a2≤J≤b2。为了更清楚表面的含义:(b1-a1+1)·(b2-a2+1)

    你能帮我出点主意吗。非常感谢

    编辑1:两个矩形可能重叠


    EDIT2:其中一个矩形允许曲面0

    我的原始方法。在最佳解决方案需要重叠矩形的情况下(例如,0背景上的“+”为1),这不起作用

  • 找到包含所有1的最小边界矩形
  • 第一个矩形从该边框的左上角延伸,第二个边框从左上角延伸 此边框的右下角
  • 对于边界矩形顶部和底部之间的每一行R,创建从顶部延伸到R和R的候选矩形 从底部到R,都是边框的宽度
  • 减少这两个候选对象,使它们成为其中1的最小边界矩形。这些矩形对都满足 第1点。在所有R上保持最小值
  • 重复步骤2,覆盖整个边界矩形中的每一对角,并保持最佳整体解决方案
  • 在尝试了几次失败的有效解决方案后,我认为找到最佳解决方案的唯一方法如下:

    你只需要考虑1s的边界矩形。两个边界矩形不会位于该区域之外。假设边界矩形从行(R1,C1)到(R2,C2)

    选择您找到的最佳备选解决方案


    注:

    • 最好的解决方案不会有重叠的矩形,因为这样的解决方案总是可以通过减少其中一个矩形使其不再重叠来改进。因此,我们只需要在步骤3中选择一个R(而不是每个矩形的独立最大行)
    • 无论是按行(R)还是按列(C)拆分,都没有关系,但不需要同时执行这两项操作。为了提高速度,可以在边框短而粗时选择行,在边框高而细时选择列
    • 如果您找到一个候选解决方案,其中两个矩形都不包含任何零,那么它必须是最佳解决方案,您可以停止

      • 我最初的方法。在最佳解决方案需要重叠矩形的情况下(例如,0背景上的“+”为1),这不起作用

      • 找到包含所有1的最小边界矩形
      • 第一个矩形从该边框的左上角延伸,第二个边框从左上角延伸 此边框的右下角
      • 对于边界矩形顶部和底部之间的每一行R,创建从顶部延伸到R和R的候选矩形 从底部到R,都是边框的宽度
      • 减少这两个候选对象,使它们成为其中1的最小边界矩形。这些矩形对都满足 第1点。在所有R上保持最小值
      • 重复步骤2,覆盖整个边界矩形中的每一对角,并保持最佳整体解决方案
      • 在尝试了几次失败的有效解决方案后,我认为找到最佳解决方案的唯一方法如下:

        你只需要考虑1s的边界矩形。两个边界矩形不会位于该区域之外。假设边界矩形从行(R1,C1)到(R2,C2)

        选择您找到的最佳备选解决方案


        注:

        • 最好的解决方案不会有重叠的矩形,因为这样的解决方案总是可以通过减少其中一个矩形使其不再重叠来改进。因此,我们只需要在步骤3中选择一个R(而不是每个矩形的独立最大行)
        • 无论是按行(R)还是按列(C)拆分,都没有关系,但不需要同时执行这两项操作。为了提高速度,可以在边框短而粗时选择行,在边框高而细时选择列
        • 如果您找到一个候选解决方案,其中两个矩形都不包含任何零,那么它必须是最佳解决方案,您可以停止

        两个覆盖矩形是否允许重叠?(请将答案编辑为问题)重复问题可能重复,但也没有答案。两个覆盖矩形是否允许重叠?(请将答案编辑为问题)重复问题可能重复,但也没有答案。通过查看中的示例,我现在意识到我关于重叠矩形的陈述是不正确的。我会再考虑一下。是的,当然有一些简单的例子说明你关于重叠矩形的说法是错误的。如果&当您修复该问题时,还要估计运行时间;例如,您的“5.从步骤2重复”可能会导致O(N^3)时间,还是O(N^4)?(前面的问题提到O(N^4))我对问题的复杂度没有限制,因为总是有六对角,所以我认为这只是一个线性乘法器,不会影响很大的oh复杂度。一个矩形允许曲面为0,所以在某些情况下可能不方便
            For S1 in R1 to R2
                For S2 in S1 to R2
                    For D1 in C1 to C2
                        For D2 in D1 to C2
                            Reduce the rectangle (S1, C1)-(S2, C2) to be the minimum bounding rectangle of the 1s it contains
                            Reduce the rectangle (R1, D1)-(R2, D2) to be the minimum bounding rectangle of the 1s it contains that aren't already in the other rectangle. This is a candidate solution.
        
                            Reduce the rectangle (R1, D1)-(R2, D2) to be the minimum bounding rectangle of the 1s it contains.
                            Reduce the rectangle (S1, C1)-(S2, C2) to be the minimum bounding rectangle of the 1s it contains that aren't already in the other rectangle. This is another candidate solution.