【问题标题】:What would be the most efficient method to find unique cells in a matrix (nested arrays) using Javascript?使用 Javascript 在矩阵(嵌套数组)中查找唯一单元格的最有效方法是什么?
【发布时间】:2022-11-18 09:36:38
【问题描述】:

假设我们有一个矩阵,如下所示。

var arr = [
    [1, 0, 0, 0, 0],
    [0, 2, 0, 3, 0],
    [0, 4, 0, 0, 0],
]

这里 arr[0][0] 是唯一的唯一单元格(必须在行和列中具有唯一值,不包括 0)。查找相似单元格列表的最有效方法是什么?

【问题讨论】:

  • 你是说arr[0][0]
  • 你似乎没有很好地解释你的意图。如果您正在寻找独特的单元格,那么所有非零单元格似乎都满足该条件。但是,如果您正在寻找在各自的行和列中具有唯一非零值的单元格,则可能是建议的arr[0][0]
  • 我听起来不像“独特”是你想用的词
  • 您当前想要改进的解决方案是什么?
  • 直截了当的解决方案非常高效,在线性时间内运行

标签: javascript


【解决方案1】:

正如@Bergi 在 cmets 中建议的那样,这是他可能意味着的解决方案:

您首先获得行,将每行中的唯一项聚合到一个对象中,该对象的键是所找到的唯一项的坐标的字符串表示形式。让该键的值为 1。

然后你对列做同样的事情。这次如果存在键,则添加 + 1。

所以最后你通过同时出现在行和列中的那些来过滤结果。

var arr = [
  [1, 0, 0, 0, 0],
  [0, 2, 0, 3, 0],
  [0, 4, 0, 0, 0],
];

var obj_keys = {}

// first let's do the rows
arr.forEach(function(row, i) {
  var key = null;
  var fail = false;
  row.forEach(function(item, j) {
    if (item && !fail) {
      if (key) {
        fail = true
      } else {
        key = i + "," + j
      }
    }
  })
  if (key && !fail) {
    obj_keys[key] = obj_keys[key] || 0
    obj_keys[key]++
  }
})

// now columns
for (var j = 0; j < arr[0].length; j++) {
  var key = null;
  var fail = false;
  for (var i = 0; i < arr.length; i++) {
    var item = arr[i][j];
    if (item && !fail) {
      if (key) {
        fail = true
      } else {
        key = i + "," + j
      }
    }
  }
  if (key && !fail) {
    obj_keys[key] = obj_keys[key] || 0
    obj_keys[key]++
  }
}
// console.log(obj_keys)

var result = Object.entries(obj_keys).filter(function([key, value]) {
  return value == 2
}).map(function([key, value]) {
  return key;
})
console.log(result)

【讨论】:

  • 有没有更有效的方法来做到这一点?这对于小矩阵来说很好。如果它有成百上千行和列呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 2016-01-16
  • 2023-04-05
  • 2018-11-26
相关资源
最近更新 更多