在给定二进制 MxN 矩阵和切换列的能力的情况下最大化行相同性?

Posted

技术标签:

【中文标题】在给定二进制 MxN 矩阵和切换列的能力的情况下最大化行相同性?【英文标题】:Maximize row-sameness given a binary MxN matrix and the ability to toggle columns? 【发布时间】:2014-11-02 00:48:47 【问题描述】:

如果您有一个 1 和 0 的二进制矩阵,并且您能够切换列(将列中的所有 1 更改为 0,并将所有 0 更改为 1),您如何找到“纯”行的最大数量对于所有可能的列切换组合? “纯”表示该行全为 0,或全为 1。

例如:

1 0

1 0

1 1

您可以切换任一列以获得 2 行“纯”,这是您能做的最好的(切换两者并不是更好),因此您返回 2(“纯”行的最大数量)。

我似乎无法找到一种有效的方法来做到这一点。到目前为止,我得到的唯一方法是使用一堆循环和蛮力,并通过检查一行的总和是 0(全 0)还是 N(一行中的元素数)来检查是否相同。

【问题讨论】:

【参考方案1】:

更新

在 OP 澄清后,最大纯行问题是找到切换后变为 00...0 或 11...1 的最大行数。我已经相应地更新了我的解决方案。

请注意,我们有以下事实:

    如果两行 rirj 在切换后减少为纯行,那么我们必须以 ri = rj 开头。

    如果 rirjri重叠rj(即它们对应的一些列是相同的),那么它们都不能映射到一个纯行。

以上两个事实都直接来自以下观察:

Max number of "pure" rows is the same as the max number of identical rows

证明

我们声称构成最大纯问题解的所有行在矩阵 M 中必须相同。

假设给定一个 m×n 矩阵M,并且我们已经找到了最大纯行问题的解决方案。让行 rirj 是两个任意行,在切换后会减少为纯行。 p>

请注意,在对列进行所有必要的切换操作之后(用 σ1 表示,σ2 , ..., σk), rirj sub> 都是“纯”行。即我们有以下内容:

σ1(σ2(...(σk(ri)...)) = σ1(σ2(...(σk(rj)...)) = 00...0

σ1(σ2(...(σk(ri)...)) = σ1(σ2(...(σk(rj)...)) = 11...1

所以在应用所有这些切换操作之后,rirj 将彼此相等。如果我们撤消最后一次切换(即我们切换这些行的同一列条目),很明显 ri 和 rj 仍将映射到相同的输出。即我们有以下内容:

σ2(σ3(...(σk(ri)...)) = σ2(σ3(...(σk(rj)...))

如果我们继续撤消切换操作,我们可以得出结论 ri = rj。换句话说,如果您从最大纯问题的解中选择任意行,则这些行在开始时必须相同。

想法

给定一行ri,如果可以归约为纯行,比如00...0,那么我们知道另一行r如果 rirj 重叠,则 j 不能减少到 11...1 sub> (来自上面的事实 2)。我们只能希望与 ri 不重叠的另一行 rk 减少到 11.. .1.

算法

根据前面的思路,我们可以有以下简单的算法来解决最大纯行问题。

我们首先扫描矩阵M的行,然后找到矩阵的所有唯一行(记为s1,s 2, ..., sk)。我们让count(si) 表示 si 在 M 中出现的次数。 然后我们遍历所有对 (si, sj) 以确定最大纯行数,如下所示:

int maxCount = 0;

for each row si:
    for each  sj ≠ si:
        if (sj overlaps si)
            continue;
        else
            if (count(si) + count(sj) > maxCount)
                // We have found a better pair
                maxCount = count(si) + count(sj);    

return maxCount;

我们在 O(n) 内部 for 循环中工作(用于逐项检查两行是否重叠),循环在最坏情况下超过 O(m<sup>2</sup>) 行,因此算法的运行时间是O(nm<sup>2</sup>).

【讨论】:

如果它们是纯的,为什么它们必须相同? [[0,1],[1,0]] 不是反例吗(如果切换第 1 列,则会得到 2 个不相等的纯行)? 只需要澄清你的问题。从您的评论看来,您要求的结果行的最大数量是 either 00...0 或 11...1,但不完全属于这些类别之一,对吗? 是的...如果将 101 和 010 之类的行标识为相同,您的解决方案可能会起作用 我已经修改了我的解决方案来解决这个问题【参考方案2】:

也许我遗漏了一些东西,但是快速浏览一下行应该可以回答您的问题。

从顶行开始,根据需要翻转每一列,直到顶行都是T。计算纯行数。每隔一行重复一次,查看计数是否大于前一行。

您不需要将整个矩阵反转,因此每一行都是 F,计数将是相同的。

最坏情况下的运行时间是O(nm)

【讨论】:

以上是关于在给定二进制 MxN 矩阵和切换列的能力的情况下最大化行相同性?的主要内容,如果未能解决你的问题,请参考以下文章

检查给定行和列总和是不是只有 2 行的二进制矩阵

螺旋矩阵

leetcode240——搜索二维矩阵(medium)

leetcode240——搜索二维矩阵(medium)

b_lc_给定行和列的和求可行矩阵(找行和列的和的最小值填)

73#矩阵置零