【问题标题】:Given 2d matrix find minimum sum of elements such that element is chosen one from each row and column?给定二维矩阵,找到元素的最小总和,使得从每一行和每一列中选择一个元素?
【发布时间】:2016-06-21 16:09:41
【问题描述】:

找到 n*n 2D 矩阵的元素的最小总和,这样我必须从每一行和每一列中选择一个且只有一个元素? 比如

4  12 

6  6

如果我从 1 行中选择 4 我不能从 1 行中也从 1 列中选择 12 , 我只能从第 2 行第 2 列中选择 6。

同样,最小总和将是4 + 6 = 10,其中6 来自第二行第二列

而不是6 + 12 = 18 6 来自第二行第一列

也不允许4 + 12,因为两者都来自同一行

我想到了蛮力,一旦我从行和列中选择元素,我就无法选择另一个,但这种方法是 O(n!) .

【问题讨论】:

  • 看匈牙利算法的赋值问题。

标签: algorithm graph-algorithm hungarian-algorithm


【解决方案1】:

定理:如果一个数被加到或减去 矩阵的任何一行或一列的条目, 然后选择元素以获得所需的结果矩阵的最小总和 是为获得所需的原始矩阵的最小总和而选择的相同元素。

Hungarian Algorithmmin-cost flow 问题的一个特例)使用这个定理来选择满足问题中给定约束的元素:

  1. 从其所有条目中减去每一行中最小的条目 行。
  2. 从所有条目中减去每列中最小的条目 其列。
  3. 在适当的行和列之间画线,这样所有的 成本矩阵的零项被覆盖,并且最小数量的 使用这样的行。
  4. 最优性测试
    一世。如果覆盖线的最小数量为 n,则可以进行最佳的零分配,我们就完成了。
    ii.如果最小覆盖线数小于 n,则最优 还不可能分配零。在这种情况下,请继续执行第 5 步。
  5. 确定未被任何行覆盖的最小条目。减去 此条目来自每个未覆盖的行,然后将其添加到每个覆盖的行 柱子。返回第 3 步。

请参阅this example 以获得更好的理解。

O(n4)(容易且快速实现)和 O(n3)(更难实现) 实现详细解释here

【讨论】:

    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多