拼图:对于布尔矩阵,查找行和列的排列,允许将分解成最小的覆盖矩形集

时间:2018-04-03 19:45:14

标签: algorithm

假设我知道一种算法,它将布尔矩阵划分为一组覆盖所有“一”(“trues”)的不相交矩形。 任务是找到矩阵的行和列的排列,这样通过根据排列对列和行进行混洗而构建的矩阵可以被划分为一组最小的矩形。

为了说明,人们可以这样思考问题:

  

假设我有一组对象和一组属性。每个对象可以具有任意数量的(不同的)属性。任务是使用最少量的句子来总结(报告)该映射。每个句子都有一个“<list of objects> have properties <list of properties>”形式。

我知道我可以通过应用排列来强制解决方案并在每次尝试时运行算法。但是时间复杂度呈指数级增长,使得这种方法对于大于15×15的矩阵是不实用的。

我知道我可以在运行算法之前通过删除重复的行和列来简化矩阵。

这个问题感觉它是NP难的,并且可能没有快速(多项式及时)解决方案。如果是这样,我有兴趣了解一些近似的解决方案。

2 个答案:

答案 0 :(得分:1)

在给定完整的输入(特征)和所需的真值表(哪些行具有哪个特征)的情况下,这与减少逻辑电路是同构的。您可以使用经典布尔代数解决问题。该过程称为logic optimization

当我在学校时,我们在棋盘上画了Karnaugh maps并绘制了彩色边界以形成我们的矩形。然而,听起来好像你有一个比一个人在板上处理更大的东西;尝试QM algorithm和引用的启发式方法,为许多应用程序提供“足够好”的解决方案。

答案 1 :(得分:0)

到目前为止我的解决方案:

首先让我们承认,问题是关于用列交换行(对象的特征)是对称的。

让我们用二进制矩阵来表示问题,其中行是对象,列是要素,矩阵中的行表示匹配对(对象,特征)。

到目前为止,我的想法是按顺序运行两个步骤,直到矩阵中没有1:

  1. 启发式地找到行和列的良好疏忽排列,我可以在其上运行2D最大矩形
  2. 找到最大矩形,将其保存到答案列表,并将属于它的所有1归零。
  3. 最大矩形问题

    它可以是网上找到的最大矩形问题的任何实现,例如https://www.geeksforgeeks.org/maximum-size-rectangle-binary-sub-matrix-1s/

    对行(和列)进行非混乱

    非抽动行独立于非抽动列,两个任务可以单独运行(并发)。让我们假设我正在寻找列的无拘无束的排列。

    另外,值得注意的是,如果我们用零交换,那么矩阵的非混乱应该会产生相同的结果。

    1. 构建列的距离矩阵。两列之间的距离定义为两列之间的曼哈顿距离以数字表示(即0 - 对象和特征之间没有关系,1 - 存在)
    2. 使用距离矩阵运行层次聚类。复杂度为O(n ^ 2),因为我认为单链接应该足够好。
    3. 从层次聚类返回的对象的顺序是无混乱的排列。
    4. 该算法对我的用例来说足够好。 R中的实现可以在https://github.com/adamryczkowski/rectpartitions

      中找到