Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用最小行和列切换将NxN二进制矩阵转换为零矩阵_Algorithm_Matrix - Fatal编程技术网

Algorithm 使用最小行和列切换将NxN二进制矩阵转换为零矩阵

Algorithm 使用最小行和列切换将NxN二进制矩阵转换为零矩阵,algorithm,matrix,Algorithm,Matrix,这是关于我发布的关于将一个NxN二进制矩阵转换为另一个的问题。我问的问题是一个代码挑战问题。然而,在会议上提出了一个类似的问题。我通过这条线索,对如何着手解决这个问题有了一些想法。 我在这里重申这个问题 我想编写代码来解决以下问题。我计划使用C、C++、java或Python,这取决于允许更方便的解决方案。 给出两个NxN(1相当简单的任务 首先,我们应该理解,对一行或一列进行多次切换是没有意义的。为了更好地理解,我们将状态表示为:每个单元格中都有0或1,并且总是取模为2的和的结果: final

这是关于我发布的关于将一个NxN二进制矩阵转换为另一个的问题。我问的问题是一个代码挑战问题。然而,在会议上提出了一个类似的问题。我通过这条线索,对如何着手解决这个问题有了一些想法。 我在这里重申这个问题

我想编写代码来解决以下问题。我计划使用C、C++、java或Python,这取决于允许更方便的解决方案。 给出两个NxN(1相当简单的任务

首先,我们应该理解,对一行或一列进行多次切换是没有意义的。为了更好地理解,我们将状态表示为:每个单元格中都有0或1,并且总是取模为2的和的结果:

final[i,j] = initial[i,j] + row_switched[i] + column_switched[j]  (mod 2)
其中,
row\u switched
column\u switched
是我们切换第i行和第j列的次数。现在很清楚,它们的值应该是0或1,以获得最少的切换次数

但这实际上构成了一个方程组!我们知道初始状态(给定),我们知道最终状态(零),我们只需要根据
r[i]
c[j]
求解系统

不幸的是,由于模的存在,而且它不包括
r[i]
c[j]
上隐含的约束(即0或1),所以它仍然很复杂


让我们重写这些没有模数的条件:

row_switched[i] + column_switched[j] = 1  (if initial[i,j] = 1)
row_switched[i] - column_switched[j] = 0  (if initial[i,j] = 0)
在为每个单元格编写了这篇文章之后,我们得到了一个由N^2个方程组成的超定义系统。让我们用以下方法求解它。很明显,如果我们知道
行切换[0]
的值,那么我们就知道整个
列切换[]
array,因为它们是由方程明确推导出来的,
row\u switched[0]
参与其中。这样就很容易推导出每一行的值

但是对于
行切换[0]
,我们只有两个变量:0和1。让我们试一下它们中的每一个(见下面的注释),并分别计算两个数组!然后,我们应该检查所有方程是否都成立,并从满足整个系统且开关较少的两个集合中选择一个

如果两者都不满足,那么,好吧,这是无法解决的。试着解决这个问题,呵呵:

0 1
0 0
这就完成了解决方案。我希望您只需尝试一下,就可以使用+1。:)


关于为什么这是最少可能的开关数量的问题。实际上,任何有效的开关数量都应该满足上述方程组(0和1作为值的约束条件)但是这个系统只有两个解,我们都在上面的算法中找到了它们。因此,上面的算法肯定找到了最小的一个


注意: 在我看来,我们只能尝试集合中的一个。如果一个通过了系统,另一个也应该通过。一个集合是另一个集合的否定,所以我们只选择开关数较少的集合。开关总数为2N。但是这看起来只是,而且不如另一个部分清晰。

任务相当简单

首先,我们应该理解,对一行或一列进行多次切换是没有意义的。为了更好地理解,我们将状态表示为:每个单元格中都有0或1,并且总是取模为2的和的结果:

final[i,j] = initial[i,j] + row_switched[i] + column_switched[j]  (mod 2)
其中,
row\u switched
column\u switched
是我们切换第i行和第j列的次数。现在很清楚,它们的值应该是0或1,以获得最少的切换次数

但这实际上构成了一个方程组!我们知道初始状态(给定),我们知道最终状态(零),我们只需要根据
r[i]
c[j]
求解系统

不幸的是,由于模的存在,而且它不包括
r[i]
c[j]
上隐含的约束(即0或1),所以它仍然很复杂


让我们重写这些没有模数的条件:

row_switched[i] + column_switched[j] = 1  (if initial[i,j] = 1)
row_switched[i] - column_switched[j] = 0  (if initial[i,j] = 0)
在为每个单元格编写了这篇文章之后,我们得到了一个由N^2个方程组成的超定义系统。让我们用以下方法求解它。很明显,如果我们知道
行切换[0]
的值,那么我们就知道整个
列切换[]
array,因为它们是由方程明确推导出来的,
row\u switched[0]
参与其中。这样就很容易推导出每一行的值

但是对于
行切换[0]
,我们只有两个变量:0和1。让我们试一下它们中的每一个(见下面的注释),并分别计算两个数组!然后,我们应该检查所有方程是否都成立,并从满足整个系统且开关较少的两个集合中选择一个

如果两者都不满足,那么,好吧,这是无法解决的。试着解决这个问题,呵呵:

0 1
0 0
这就完成了解决方案。我希望您只需尝试一下,就可以使用+1。:)


关于为什么这是最少可能的开关数量的问题。实际上,任何有效的开关数量都应该满足上述方程组(0和1作为值的约束条件)但是这个系统只有两个解,我们都在上面的算法中找到了它们。因此,上面的算法肯定找到了最小的一个


注意
在我看来,我们只能尝试集合中的一个。如果一个通过了系统,另一个也应该通过。一个集合是另一个集合的否定,因此我们只选择开关数较少的集合。开关数之和为2N。但这似乎只比另一个部分更清楚。

让我再次尝试解释我的答案的结尾n

如果可能的话,我们已经将问题简化为通过切换将矩阵转换为零矩阵