【问题标题】:Fastest way of finding argmax in 2d array在二维数组中查找 argmax 的最快方法
【发布时间】:2020-11-03 22:48:09
【问题描述】:

JavaScript 对我来说远非一门熟悉的语言。我有一条逻辑我正在尝试优化速度。它包括找到二维数组(矩形)的 argmax、行和列索引。目前,我有一个幼稚的实现

function argMax2d(arr) {
  var rowMax = 0, colMax = 0;
  for( var rowIndex = 0; rowIndex < arr.length; rowIndex++){
    for( var colIndex = 0; colIndex < arr[rowIndex].length; colIndex++){
      if (arr[rowIndex][colIndex] > arr[rowMax][colMax]){
        rowMax = rowIndex;
        colMax = colIndex;
      }
    }
  }
  return [rowMax, colMax];
}

在 Python 中,由于没有利用数据的连续性,这将是一种非常缓慢的完成工作的方式。

PS:arr总是矩形的,每一行的列数都是一样的

【问题讨论】:

  • 除非数组有任何模式(例如有序),否则我认为没有其他算法可以做。你可以尝试使用workers做多线程(一个worker for row)
  • 你想找到数组中最大值的索引还是实际的最大值?在第一种情况下,如果最大值在 2 个地方,你想返回哪个?
  • 我会尝试的唯一改进是将最大值复制到一个变量中,以便在以后的比较中它是一个变量访问而不是两个数组访问。
  • @Maxwells.c 谢谢,这里真的没有模式。
  • @GabrielePetrioli 我想要索引,argmax 不是最大值。如果有退化,任何可能性都是好的。

标签: javascript arrays optimization


【解决方案1】:

基于问题中的 cmets,我能想到的唯一 最小 优化是缓存数组的长度以避免在每次迭代中访问它们,对于用于比较。

    function argMax2d(arr) {
      var rowMax = 0,
          colMax = 0,
          vLength = arr.length,
          hLength = arr[0].length,
          maxValue = -Infinity;
          
      for (var rowIndex = 0; rowIndex < vLength; rowIndex++) {
        for (var colIndex = 0; colIndex < hLength; colIndex++) {
          if (arr[rowIndex][colIndex] > maxValue) {
            maxValue = arr[rowIndex][colIndex];
            rowMax = rowIndex;
            colMax = colIndex;
          }
        }
      }
      
      return [rowMax, colMax];
    }

JS performance comparison

【讨论】:

  • 感谢您的意见。我真的很喜欢直接的基准,它可以量化有多少事情正在加速。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 2017-01-26
  • 2018-07-30
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多