【问题标题】:Iterative Reduction to Null Matrix迭代归约到空矩阵
【发布时间】:2012-12-15 09:22:13
【问题描述】:

问题来了:我得到了一个类似的矩阵

输入:

1 1 1
1 1 1
1 1 1

在每一步,我都需要找到一个由 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  

我的解决方案适用于大多数测试用例,但不适用于上面给出的那个。有人可以给我一些关于如何进行的指示,或者找到一种保证最优性的算法吗?

有效的测试用例:

输入:

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

【问题讨论】:

  • 您能解释一下您要做什么吗?从你给出的例子中我真的看不出来。
  • 我没有使用任何算法...我只是获取行/列最大值并递减第一个非零值。
  • 行/列最大值是什么意思?
  • 我正在尝试以最少的迭代次数达到全 0 .. 一行最多可以减少一列的值,反之亦然在一个循环中...
  • 例如,在 3x3 矩阵中,行/列最大值为 3。我正在选择...

标签: java algorithm optimization graph matrix


【解决方案1】:

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


例如:

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 次最优减法才能清空。


我相信从此倒数并从具有该值的列/行中删除将解决您的问题(我不确定选择这些的有效方法 - 蛮力?)。
您也可以使用之前的方法删除多余的元素。


例如(使用上面的矩阵)。

第 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 的问题(与您在示例中所做的相同)。

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

【讨论】:

    【解决方案2】:

    令行数 = 列数 = N

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

    迭代次数为 N。在每次迭代中,N 个将变为 0

    【讨论】:

    • 不,这不起作用,因为它将所有行元素递减为 0。即 a[0][0]、a[0][1] 和 a[0][2] 都递减第一轮到0。问题是当你减少它必须在不同的行/列中的值时。
    • @user1459032 在第一轮中,递减的值将是 a[0][0]、a[1][1]、a[2][2] 等等。如果所有值都是 0 或 1 并且值的数量是 N,那么我的解决方案将起作用。如果不是这种情况,我明白你的意思。
    • 我需要每次将值减1
    【解决方案3】:

    我不完全确定这是否是您所追求的,但您能否创建一个可用列的列表并将它们标记为用于每次迭代。

    例如:

    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 正在使用的算法。

    【讨论】:

      【解决方案4】:

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

      2) 那么你所要做的就是循环for (int i=0; i < rows*cols; i++) {} ...

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

      【讨论】:

      • 我认为它比这更复杂。 :-)
      • @paulsm4 讨论矩阵算法时的惯例是,N 是行数或列数,而不是行数和列数的乘积。例如,矩阵乘法是 O(N3) - 2x2 矩阵需要 ~2x8 操作,3x3 ~ 2x27 操作。所以你的算法是 O(N2)。有关此约定的示例,请参见 en.wikipedia.org/wiki/Strassen_algorithm#Asymptotic_complexity 或任何其他矩阵算法描述。
      【解决方案5】:

      我很确定这是exact cover problem 的某种变体,已知它是NP-complete。您提出的算法是一个简单的贪心解决方案。贪婪解决方案的问题在于,它们通常运作良好,足以让你相信贪婪是好的,然后突然让你高高在上,寻找更好的解决方案。 (例如,考虑全球经济。)无论如何,Knuth 的 Dancing Links 技术是解决问题的标准方法(精确集合,而不是全球经济)。

      【讨论】:

        猜你喜欢
        • 2013-07-30
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多