矩阵中的最大值

时间:2012-06-15 03:33:28

标签: algorithm optimization

所以这是C#中一个有趣的问题。我正在寻找一种更好的解决方法:

  

给定匹配的矩阵M(不一定是平方),找到最佳匹配元素。元素i将elem j与值M(i,j)匹配。 M(i,j)!= M(j,i)。

     

由于#rows!= #columns,找到匹配对(i,j)的最佳min(#rows,#columns)。

基本上问题是从每行/每列中选择最大值,这样就不会选择两行/列。

示例:

     1  2  3 
  +---------
a | 10  3  1
b | 12  99 2
c | 20  5  3
d |  5  7  4

此矩阵中的最大值为99,因此最佳匹配为(b,2)。对于下一个选择,我们不能再使用第b行和第2列了。就像切割它们一样

     1  2  3  or, if you prefer,       1   3
  +---------  a smaller matrix:      +------
a | 10 ||  1                       a | 10  1
b | ===++===                       c | 20  3
c | 20 ||  3                       d | 5   4
d |  5 ||  4             

最大值现在为20,匹配为(c,1)。剩下的矩阵只有一列。 在另一个选秀之后我们将得到匹配(d,3)匹配= 4

最后“a”没有匹配。

我当前的实现使用2个数组来存储已经匹配的行/列,并且每个匹配遍历整个矩阵,选择属于row / col的第一个最大值不匹配。

PS:如果值具有相同值的多个匹配,则只选择其中一个 PS2:数组存储为int [,]

你会如何以更优/更美的方式解决这个问题?

2 个答案:

答案 0 :(得分:3)

如果您尝试最大化所选单元格的总和,以便从每一行和每列中选择一个单元格,那么这是http://en.wikipedia.org/wiki/Assignment_problem。如果您的矩阵不是正方形,您可以通过向它们添加行或列来使其成为正方形,新单元格中的值表示除非没有其他方法可以填充解决方案,否则不会选择它们。

(如果你没有最大化总和,你需要说明你所选择的值的最大值是什么 - 是(1,3)比(2,2)更好?。否则你进入http://en.wikipedia.org/wiki/Multi-objective_optimization ,这是可能的,但更复杂)。

答案 1 :(得分:1)

您可以先按降序排序矩阵的所有条目,然后处理排序列表。每当您在已经选择的行/列中看到一个条目时,就意味着应该选择条目,因此您标记相应的行/列并继续向下列表,直到所有行或所有列都有被选中了。