【发布时间】:2014-09-01 05:38:46
【问题描述】:
你有一个 i 乘 j 矩阵。出于本示例的目的,采用以下(非常小的)矩阵。但是,该算法应该是快速且可扩展的。
values <- c(2,5,3,6,7,
9,5,4,9,9,
1,5,4,8,1,
3,1,5,6,2,
2,9,4,7,4)
my.mat <- matrix(values, nrow = 5, byrow = TRUE)
目标: 迭代地从 my.mat 中删除行或列,使得 mean(c(apply(my.mat, 1, min), apply(my.mat, 2, min)))给定删除的行数和列数,最小化。贪婪地这样做(所以一旦删除一列或一行,它就永远不会返回到矩阵)。换句话说,只需删除具有最大最小值的行或列。以下注意事项适用。
首先,如果删除行或列会更改列或行的最小值(即,如果它们彼此都是最小值),请删除 (row, column) 对。如果一行或一列与多列或多行配对,则迭代删除额外的列或行,直到配对为 1:1,然后同时删除剩余的对。二、有平局的地方,随机选择。
输出:表示根据此目标的移除顺序的向量。它可以引用行/列名称,也可以引用单元格值,只要它暗示正确的删除顺序即可。
所以对于上面的矩阵,一个正确的答案是……
(Column 4), (Row 2), (Column 3), (Either Row 1 or Row 5), (Row 5 or Row 1), (Column 1 or Column 5), (Row 4 and Column 2), (Column 5 or Column 1 AND Row 3)
但是,实际的实施不应该是不确定的。例如,它应该随机选择第 5 行或第 1 行,然后在适当的时候在后面的步骤中删除剩余的行。
很容易想象一个非常草率的解决方案。然而,很难想象一个快速的矢量化解决方案。
如果没有列和行不相互配对的关系,并且如果没有多行或多列与单个列或行配对的实例,您可以简单地对唯一的行和列最小值进行排序,然后迭代删除最小值等于排序最小值中第 i 个值的行和列。但是,当有关联时,例如在 my.mat 中,这会中断,因为它会不必要地删除不会更改相应列或行的最小值的行和列。例如,如果一行与两列配对,它们的最小值都相同,因此这种粗略的算法将删除该行和两列,当正确答案是随机删除其中一列时,然后将两者都删除剩余的列和行。解决此问题的一种可能方法是抖动值以隐含正确的排序,但随着矩阵变大,很难确保抖动不会导致排序错误。
编辑 1:解释示例
AndrewMacDonald 就该示例提出了一个问题,因此我将解释顺序。
每行和每列的最小值如下,其中Ci、Ri是第i列、行。
C4 R2 C3 R1 R5 R3 R4 C1 C2 C5
6 4 3 2 2 1 1 1 1 1
前三个步骤很简单。 C4、R2 和 C3 不是其他行或列的最小值,也没有任何关系。所以,步骤 1 - 3...
完整矩阵:
C1 C2 C3 C4 C5
R1 2 5 3 6 7
R2 9 5 4 9 9
R3 1 5 4 8 1
R4 3 1 5 6 2
R5 2 9 4 7 4
1) 删除 C4。
C1 C2 C3 C5
R1 2 5 3 7
R2 9 5 4 9
R3 1 5 4 1
R4 3 1 5 2
R5 2 9 4 4
2) 移除 R2
C1 C2 C3 C5
R1 2 5 3 7
R3 1 5 4 1
R4 3 1 5 2
R5 2 9 4 4
3) 移除 C3
C1 C2 C5
R1 2 5 7
R3 1 5 1
R4 3 1 2
R5 2 9 4
然后,R1 和 R5 之间存在平局(两者都至少有 2 个)。它们显然不是相互配对的,也不是任何列的最小值,因此我们可以一次删除它们而不更改任何其他行或列的最小值。我们在两者之间随机选择以确定顺序。
4) 第 1 行或第 5 行(我会随意选择第 1 行)
C1 C2 C5
R3 1 5 1
R4 3 1 2
R5 2 9 4
5) 第 5 行或第 1 行(以未在第 4 步中选择的为准)
C1 C2 C5
R3 1 5 1
R4 3 1 2
剩余的行和列被绑定 = 1。您不能删除 R3,因为这样 C1 或 C5 会变得更糟。但是您可以删除 C1 或 C5 而不会使 R3 变得更糟。同样,您不能在不使另一个变得更糟的情况下删除 R4 或 C2。所以我们必须同时移除 R4 和 C2。
最后几个步骤是,删除 C1 或 C5 中的一个,然后删除剩余的两对(R4 和 C2、R3 以及剩余的 C1 或 C5)。
6) C1 或 C5(我随便选 C5)
C1 C2
R3 1 5
R4 3 1
7) R4 和 C2
C1
R3 1
8) R3 和 C1 或 C5 的其余部分
[]
注意:步骤 7 和 8 实际上可以互换。同样,在它们之间随机选择。
【问题讨论】:
-
我不明白。三列(第 1、2 和 5 列)和两行(3 和 4)具有相同的最小值,1. 你是如何决定删除顺序的?上面答案中的倒数第三个元素不应该是
(Column 1 or Column 5 or Column 2)吗? -
删除第 2 列会使第 4 行变得更糟,因此我们必须将它们成对删除。请参阅我为回答您的问题而添加的解释。谢谢!
-
行或列变得“更糟”是什么意思?
-
啊,我明白了——当一列的最小值等于一行的最小值时,它们必须一起离开。
-
对,只要没有其他列或行具有相同的值(如第 3 行)。
标签: r algorithm sorting matrix minimize