Java 零矩阵的迭代化简

Java 零矩阵的迭代化简,java,algorithm,optimization,graph,matrix,Java,Algorithm,Optimization,Graph,Matrix,问题是:我得到了一个矩阵 输入: 1 1 1 1 1 1 1 1 1 0 2 1 0 0 0 3 0 0 在每一步中,我都需要找到一个由1和0组成的“第二”矩阵,在同一行或列上没有两个1。然后,我将从原始矩阵中减去第二个矩阵。我将重复这个过程,直到得到一个包含所有0的矩阵。此外,我需要采取尽可能少的步骤 我需要在O(n)时间内打印所有“第二”矩阵。在上面的例子中,通过按顺序减去这三个矩阵,我可以分3步得到空矩阵: 预期产出: 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0

问题是:我得到了一个矩阵

输入:

1 1 1
1 1 1
1 1 1
0 2 1
0 0 0
3 0 0
在每一步中,我都需要找到一个由1和0组成的“第二”矩阵,在同一行或列上没有两个1。然后,我将从原始矩阵中减去第二个矩阵。我将重复这个过程,直到得到一个包含所有0的矩阵。此外,我需要采取尽可能少的步骤

我需要在O(n)时间内打印所有“第二”矩阵。在上面的例子中,通过按顺序减去这三个矩阵,我可以分3步得到空矩阵:

预期产出:

1 0 0
0 1 0
0 0 1

0 0 1
1 0 0
0 1 0

0 1 0
0 0 1
1 0 0
我编写了一个尝试,在其中我找到了第一个最大值,并根据该值的索引创建了第二个矩阵。但对于上述输入,我得到了4个输出矩阵,这是错误的:

我的输出:

1 0 0 
0 1 0 
0 0 1 

0 1 0 
1 0 0 
0 0 0 

0 0 1 
0 0 0 
1 0 0 

0 0 0 
0 0 1 
0 1 0  
我的解决方案对大多数测试用例都有效,但对上面给出的测试用例无效。有人能给我一些关于如何进行的建议,或者找到一个保证最优性的算法吗

有效的测试用例:

输入:

1 1 1
1 1 1
1 1 1
0 2 1
0 0 0
3 0 0
输出

0 1 0
0 0 0
1 0 0

0 1 0
0 0 0
1 0 0 

0 0 1
0 0 0
1 0 0
1) 如果您只想遍历矩阵中的所有元素

2) 然后,您所要做的就是循环(inti=0;i


3) 这样的循环已经是O(n)(即它随着矩阵中的#/元素线性增加)

让行数=列数=n

for iteration=1:N
  for row=1:N
      cell(row,(row+iteration)%N) := 0

迭代次数为N。在每次迭代中,N个将被更改为0。我不完全确定这是否是您所追求的,但您能否创建一个可用列的列表,并将其标记为用于每次迭代

例如:

repeat until an empty matrix
  mark all columns as available
  for each row
    find the maximum value in all available columns and store it's coordinates
    mark that column as unavailable
  print, decrement and clear the list of stored coordinates


这不起作用,但它确实显示了user1459032正在使用的算法。

对每一行/列求和,并取其中最大的和,可以为您提供减少为空矩阵所需的最佳矩阵减法次数


例如:

1 2 4 0 = 7
2 2 0 1 = 5
0 0 1 0 = 1
3 0 2 1 = 6
= = = =
6 4 7 2
这意味着这个矩阵需要7个最佳减法才能清空


我相信从这个值向后计数并从列/行中删除该值将解决您的问题(我不确定选择这些值的有效方法-暴力?)。
您还可以使用以前的方法删除额外的元素

0 0 1 0
1 0 0 0
0 0 0 0
0 0 0 1

例如(使用上述矩阵)

第7步:
我们必须从第1行和第3列中减去

0 0 1 0
0 0 0 0
0 0 0 0
0 0 0 0
解决了这个问题,现在我们可以使用您以前的方法删除“奖金”元素

0 0 1 0
1 0 0 0
0 0 0 0
0 0 0 1
现在再次应用每行/每列的总和,并继续下一步

步骤6:

1 2 3 0 = 6
1 2 0 1 = 4
0 0 1 0 = 1
3 0 2 0 = 5
= = = =
5 4 6 1
下一步减法:

0 0 1 0
0 1 0 0
0 0 0 0
1 0 0 0
等等


注意:这仍然不能很好地处理“所有1”矩阵,因为您陷入了从每行和每列中选择1的问题(与您在示例中所做的相同)


但有人可能会扩展我的解决方案。

我很确定这是的一种变体,它被称为NP完全。您提出的算法是一个简单的贪婪解决方案。贪婪的解决方案的问题是,它们通常工作得很好,足以让你相信贪婪是好的,然后突然让你孤立无援地寻找更好的解决方案。(以全球经济为例。)不管怎样,克努特的技术是解决问题的标准方法(精确的封面,而不是全球经济)。

你能解释一下你想做什么吗?从你给出的例子中我看不出来。我没有使用任何算法…我只是得到行/列的最大值并递减第一个非零值。你说的行/列的最大值是什么意思?我试图以最少的迭代次数达到所有的0。。在一个循环中,一行最多可以减少一列的值,反之亦然……例如,在3x3矩阵中,行/列的最大值为3。我选择了那个……我认为它比那个更复杂。:-)@paulsm4在讨论矩阵算法时,约定N是行数或列数,而不是行数和列数的乘积。例如,矩阵乘法是O(N3)-2x2矩阵需要~2x8次运算,3x3~2x27次运算。所以你的算法是O(N2)。有关此约定的示例,请参阅或任何其他矩阵算法说明。否这不起作用,因为它将所有行元素递减为0。i、 e a[0][0]、a[0][1]和a[0][2]在第一轮均减至0。问题是,当您递减值时,它必须位于不同的行/列中。@user1459032在第一轮中,递减的值将是[0][0]、[1][1]、[2][2],依此类推。如果所有的值都是0或1,并且值的数目是N,那么我的解决方案将起作用。如果不是这样的话,我明白你的意思。我需要每次将值减1