【问题标题】:javascript optimization for pair finding algorithm对查找算法的 javascript 优化
【发布时间】:2017-06-09 04:55:44
【问题描述】:

我正在开发一个 javascript 函数,该函数接受一个整数数组和一个目标作为参数。任务是在数组中找到第一对整数,其总和等于目标。我已经尝试了几种不同的方法,但是对于较大的输入数组,我不断收到超时错误。有人可以给我一些关于如何更好地优化此代码的指示吗?谢谢!

var sum_pairs = function(ints, s){
  var r = [];
  var a = true;
  var l = ints.length;
  for(var j = 0; j < l; j++){
    if(a){
      for(var i = 0; i < j; i++){
        if(ints[j] + ints[i] == s){
          r[0] = ints[i];
          r[1] = ints[j];
          a = false;
          break;
        }
      }
    }
    else{
      console.log('breaking');
      break;
    }
  }
return r[0] == null ? null : r;
}

【问题讨论】:

标签: javascript performance optimization


【解决方案1】:

你可以使用一些加速机制,比如

  • 单循环,
  • 已访问值的哈希表
  • 变量a 用于元素array[i]
  • 非常短的变量名(开个玩笑)

Long list 需要 153 毫秒

var sum_pairs = function (array, s) {
    var a, i,
        hash = Object.create(null);

    for (i = 0; i < array.length; i++) {
        a = array[i];
        if (hash[s - a]) {
            return [s - a, a];
        }
        if (!hash[a]) {
            hash[a] = true;
        }
    }
};

console.log(sum_pairs([11, 3, 7, 5], 10));        // [3, 7]
console.log(sum_pairs([4, 3, 2, 3, 4], 6));       // [4, 2]
console.log(sum_pairs([0, 0, -2, 3], 2));         // undefined
console.log(sum_pairs([10, 5, 2, 3, 7, 5], 10));  // [3, 7]
console.log(sum_pairs([1, 2, 3, 4, 1, 0], 2));    // [1, 1]
console.log(sum_pairs([1, -2, 3, 0, -6, 1], -6)); // [0, -6]
console.log(sum_pairs([0, 2, 0], 0));             // [0, 0]
console.log(sum_pairs([5, 9, 13, -3], 10));       // [13, -3]
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    对于我们在迭代数组时遇到的每个数字,我们将该数字的预期伙伴target - number 添加到Set 中。一旦我们遇到一个已经在我们的集合中的数字,我们就知道它的伙伴已经遇到了,并返回这对作为解决方案:

    // Return the first two values of 'numbers' summing up to 'target':
    function sum_pairs(numbers, target) {
      let paired = new Set();
      for (let number of numbers) {
        if (paired.has(number)) return [target - number, number];
        paired.add(target - number);
      }
    }
    
    // Examples:
    console.log(...sum_pairs([9, 3, 7, 5, 1], 10)); // [3, 7]
    console.log(...sum_pairs([4, 3, 2, 3, 4],  6)); // [4, 2]
    console.log(...sum_pairs([9, 3, 6, 4, 1], 10)); // [6, 4]

    此实现具有线性运行时复杂性,因此对于长输入数组来说速度更快,但它会带来额外的内存成本。

    如果您追求原始速度,请将 for-of 循​​环替换为传统的 for 循环,并将 let 变量绑定替换为 var 声明。

    【讨论】:

    • 你的方法在长输入数组上比 Nina 的要快吗?
    • @Arrow 比 OP 的实现更快。与 NIna 的解决方案相同的运行时复杂性。
    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2021-02-25
    • 2023-03-25
    • 2018-02-22
    • 1970-01-01
    • 2017-05-23
    • 2012-01-15
    相关资源
    最近更新 更多