如何在矩阵中优化行x列组合的搜索?

时间:2017-08-09 14:32:22

标签: algorithm matrix machine-learning

给定一个1和0的矩阵,我想找到最少或没有0的行和列的组合,最大化1 1 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 0 选择。

例如,行(0,1,2)和列(0,1,3)在col#0行#1中只有一个零,其余8个值为1。

var one = [111, 222, 333, 444];
var two = [{
    identifier: 111
  },
  {
    identifier: 222
  },
  {
    identifier: 444
  }
];
var tempArray = []
two.forEach(function(item) {
  tempArray.push(item.identifier)

})
one.forEach(function(item) {
  if (tempArray.indexOf(item) === -1) {
    console.log(item)
  }
})

实际任务是搜索超过1000到1000000的行和列,在二分图中找到最大的两块 - 行和列可以被视为Verticle,值可以被视为连接。

据我所知,NP-complete中的问题。

请建议一种方法/算法,以加快任务并减少对CPU和内存的要求。

2 个答案:

答案 0 :(得分:0)

不确定你能否最小化它 但是,简单的方法就是......

  1. 将您的矩阵乘以1列,n行为1。这将为您提供每行中的数量。接下来做1行乘n列乘法(在frot)你的矩阵充满1。这将为每列提供1的总和,从那里它是一个非常简单的compairson ........
  2. 即原始矩阵...... 1 0 1 0 1 1 0 0 0

    DO 1 0 1 x 1 = 2(行总数) o 1 1 1 2 0 0 0 1 0

    DO 1 1 1 x 1 0 1 = 1(列总数)         0 1 1 2         0 0 0 0

    nb max sum是2(在你解决时你会跟踪它。

答案 1 :(得分:0)

实际上给出了以下假设: 你不在乎每行或每列有多少0 你不需要跟踪他们的订单......

然后,您只需要存储值来计算每行/每列中的总数,同时读取值并且实际上不存储矩阵本身。

如果在读取矩阵之前给出行数和列数,则可以执行以下启发式操作以减少计算时间......

  1. 跟踪当前的最大值。如果当前行无法达到此行的最大停止计数(但在列中继续)。对于列
  2. ,反之亦然

    但是你仍然有一个最糟糕的情况,其中所有行和列的污点数为1和0 ......:)