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

Algorithm 在给定二进制MxN矩阵和切换列的能力的情况下,最大化行的相同性?,algorithm,matrix,data-structures,Algorithm,Matrix,Data Structures,如果您有一个1和0的二进制矩阵,并且您能够切换列,将列中的所有1更改为0,将所有0更改为1,那么如何找到所有可能的列切换组合的最大纯行数? 纯粹的意思是该行全部为0,或全部为1 例: 10 10 11 您可以切换任一列以获得2个纯行,这是您所能做的最好的切换两个都不是更好的,因此您返回2个纯行的最大数量 我似乎想不出一个有效的方法来做这件事。到目前为止,我得到的唯一方法是使用一堆循环和蛮力,并通过检查一行的总和是否为0(全部为0)或N(一行中的元素数)来检查相同性。Update 在OP澄清后,最

如果您有一个1和0的二进制矩阵,并且您能够切换列,将列中的所有1更改为0,将所有0更改为1,那么如何找到所有可能的列切换组合的最大纯行数? 纯粹的意思是该行全部为0,或全部为1

例:

10

10

11

您可以切换任一列以获得2个纯行,这是您所能做的最好的切换两个都不是更好的,因此您返回2个纯行的最大数量

我似乎想不出一个有效的方法来做这件事。到目前为止,我得到的唯一方法是使用一堆循环和蛮力,并通过检查一行的总和是否为0(全部为0)或N(一行中的元素数)来检查相同性。

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

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

如果两行ri和rj在切换后减少为纯行,那么我们必须从ri=rj开始

如果ri≠ rj和ri重叠rj,即它们对应的一些列是相同的,那么它们不能映射到一个纯行

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

Max number of "pure" rows is the same as the max number of identical rows
证据 我们声称,构成最大纯问题解的所有行在矩阵M中必须是相同的

假设我们得到一个m×n矩阵m,并且我们已经找到了最大纯行问题的一个解。让行ri和rj是两个任意行,在切换后,它们将减少为纯行

在对σ1、σ2、…、σk、ri和rj表示的列进行所有必要的切换操作后,观察它们是否都是纯行。i、 e.我们有以下几点:

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

因此,在应用所有这些切换操作之后,ri和rj将彼此相等。如果我们撤销最后一次切换,即切换这些行的同一列条目,显然ri和rj仍将映射到相同的输出。i、 e.我们有以下几点:

σ1(σ2(...(σk(ri)...)) = σ1(σ2(...(σk(rj)...)) = 00...0
σ2(σ3(...(σk(ri)...)) = σ2(σ3(...(σk(rj)...))
如果我们继续撤消切换操作,我们可以得出ri=rj的结论。换句话说,如果从max pure问题的解决方案中选取任意行,则这些行在开始时必须相同

主意 给定一行ri,如果它可以减少到纯行,比如00…0,那么我们知道另一行rj不能减少到11…1,如果ri与上面事实2中的rj重叠。我们只能希望不与ri重叠的另一行rk减少到11…1

算法 根据前面的想法,我们可以使用下面的简单算法来解决最大纯行问题

我们首先扫描矩阵M的行,然后找到由s1,s2,…,sk表示的矩阵的所有唯一行。我们让countsi表示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;

我们正在进行内部for循环中的工作,以便在条目方面检查两行是否重叠,在最坏的情况下,循环超过Om2行,因此算法的运行时间是Onm2。

也许我遗漏了什么,但是快速运行行应该可以回答您的问题

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

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


最糟糕的运行时间是Onm。

如果行是纯的,为什么行必须相同?[[0,1],[1,0]]不是反例吗?如果切换第1列,会得到两个不相等的纯行?只需要对您的问题进行一些澄清。从您的评论中可以看出,您要求的结果行的最大数量为00…0或11…1,但不完全属于其中一个类别,是吗?是的…如果101和010等行被标识为相同,您的解决方案可能会起作用。我已相应地修改了我的解决方案以解决此问题