对于第一个置换矩阵,取第一行的第一个 1。对于第二行,取你还没有的列中的第一个 1。对于第三行,取你还没有的列中的第一个 1。等等。对所有行执行此操作。
你现在有一个置换矩阵。
接下来从原始矩阵中减去您的第一个排列矩阵。这个新矩阵现在每行和每列都有m-1。所以重复这个过程m-1 更多次,你就会得到你的m 置换矩阵。
您可以跳过最后一步,因为每行和每列都有一个 1 的矩阵已经是一个置换矩阵。无需进行任何计算。
这是一种并不总是有效的贪心算法。我们可以通过稍微改变选择规则来使其工作。见下文:
你的例子:
1 0 1 1
A = 1 1 0 1
1 1 1 0
0 1 1 1
在第一步中,我们为第一行选择 (1,1),为第二行选择 (2,2),为第三行选择 (3,3),为第四行选择 (4,4)。然后我们有:
1 0 0 0 0 0 1 1
A = 0 1 0 0 + 1 0 0 1
0 0 1 0 1 1 0 0
0 0 0 1 0 1 1 0
第一个矩阵是一个置换矩阵。第二个矩阵的每一行和每一列都有两个 1。所以我们按顺序选择:(1,3)、(2,1)、(3,2) 和......我们遇到了麻烦:第 4 列中包含 1 的行已经被使用了。
那么我们该如何解决这个问题呢?好吧,我们可以跟踪每列中剩余的 1 的数量。我们没有选择第一列未使用的列,而是选择剩余 1 数量最少的列。对于上面的第二个矩阵:
0 0 1 1 0 0 X 0 0 0 X 0 0 0 X 0
B = 1 0 0 1 --> 1 0 0 1 --> 0 0 0 X --> 0 0 0 X
1 1 0 0 1 1 0 0 1 1 0 0 X 0 0 0
0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
------- ------- ------- -------
2 2 2 2 2 2 X 1 1 2 X X X 1 X X
所以我们将在第二步中选择第 4 列,在第 3 步中选择第 1 列,在第 4 步中选择第 2 列。
总是只有一列,剩下一列 1。其他 1 必须在 m-1 之前的行中被删除。如果您有两列这样的列,那么之前必须选择其中一列作为最小列。