如何在布尔数组中查找模式组?

How to find pattern groups in boolean array?

给定一个布尔值的二维数组,我想找到至少包含 2 列和至少 2 行的所有模式。这个问题有点接近于找到 cliques in a graph.

在下面的示例中,绿色单元格代表 "true" 位,灰色单元格代表 "false"。模式 1 包含第 1、3、4 和 5 列以及第 1 和第 2 行。模式 2 仅包含第 2 和第 4 列以及第 2、3、4 行。

这背后的商业理念是寻找不同社交网络用户群体之间的相似模式。在现实世界中,行数最多可达 3E7,列数最多可达 300。

除了暴力匹配,实在想不出解决办法。

请告知问题的正确名称,以便我可以阅读更多内容,或者建议一个优雅的解决方案。

这(相当于)要求二分图中所有大于一定大小的bicliques(完全二分图)。这里的行是图的一部分A的顶点,列是另一部分B的顶点,并且每当u行v列的单元格在u \in A和v \in B之间有一条边是绿色的。

虽然你说你想找到所有的模式,但你可能只想找到 最大 个——也就是说,不能扩展为更大的模式的模式添加更多行或列。 (否则,对于任何 c >= 2 列且 r >= 3 行的模式,您还将得到超过 2^(c-2)*2^(r-3) 个可以形成的非最大模式通过删除一些行或列。)

但假设 P != NP,即使仅列出最大模式也可能需要行数和列数呈指数级增长的时间。那是因为根据绿色单元格的总数 has been proven to be NP-complete 找到 maximum(即最大可能)模式的问题:如果可以列出所有最大多项式时间内的模式,那么我们可以简单地这样做,并选择最大的,从而在多项式时间内解决这个 NP 完全问题。