对寻找算法的javascript优化

时间:2017-06-08 20:13:16

标签: javascript performance optimization

我正在研究一个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;
}

2 个答案:

答案 0 :(得分:3)

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

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

Long list需要 153 ms

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; }

答案 1 :(得分:0)

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

&#13;
&#13;
// 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]
&#13;
&#13;
&#13;

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

如果您想要原始速度,请使用传统的for循环替换for-for循环,并使用let声明替换var变量。

相关问题