需要优化功能

时间:2016-11-18 16:49:58

标签: javascript algorithm

我正在处理此功能,必须返回添加ab n次的所有可能值,例如n = 1,然后可能的值为{ {1}} a + aa + b。下面的功能有效,但它太慢了,我想优化它。有什么建议?非常感谢!

b + b

5 个答案:

答案 0 :(得分:4)

function processData(n, a, b) {
  var ans = [];
  if (a == b) {
    for (var i=0; i<n+1; i++) {
      ans.push(a * n);
    }
    return ans;
  } else if (a > b) {
    var temp = a;
    a = b;
    b = temp;
  }
  var diff = b - a;
  for (var i=0; i<n+1; i++) {
      ans.push(a * n + diff * i);
  }
  return ans;
}

好的,这是迄今为止最有效的解决方案。我刚刚在fiddle上测试了它。

所有其他三种解决方案都大大优于您的解决方案。我比@ abc123更好,因为不需要排序,比@ georg更好,因为不需要使用set或sort。

答案 1 :(得分:2)

这是一个获取a和b的位置的提案。

&#13;
&#13;
function combine(left, right) {

    function carry() {
        return c.reduceRight(function (r, _, i, o) {
            return r && !(o[i] = (o[i] + 1) % left.length);
        }, 1);
    }

    var c = Array.apply(null, { length: right.length }).map(function () { return 0; }),
        result = [];

    do {
        result.push(c.reduce(function (r, a, i) {
            r[left[a]].push(right[i]);
            return r;
        }, left.reduce(function (r, a) {
            r[a] = [];
            return r;
        }, {})));
    } while (!carry());
    return result;
}

console.log(combine(['a', 'b'], [1, 2, 3]));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

只是为了披露,答案是我的答案之一,给出了一个更详细的问题,但不完全是:Find all combinations of two arrays

答案 2 :(得分:2)

这是一个简洁的ES6功能:

&#13;
&#13;
MATCH g=(p:Person)-[f:factoid]-(u:Source) WHERE f.name[0] STARTS WITH =' A' RETURN f.name[0];
&#13;
&#13;
&#13;

答案 3 :(得分:1)

愿这更快

function process(a,b,n){
out=[];
//get difference
f=a-b;
var last=b*n;
for(i=0;i<n;i++){
out.push(last);
last+=f;
}
return out;
}

如果这是正确的话,我不会感到害羞,因为我只是测试了几个值。我想你想要别的。

答案 4 :(得分:1)

简化算法

&#13;
&#13;
// a+a 2 a 0 b
// a+b, b+a 1a 1b
// b+b 0a 2b

// a+a+a, 3a 0b
// a+b+a, a+a+b 2a 1b
// b+b+a, a+b+b 1a 2b
// b+b+b 0a 3b

// a+a+a+a 4a 0b
// a+a+a+b, b+a+a+a, a+a+b+a, a+b+a+a 3a 1b
// a+a+b+b, a+b+a+b, a+b+b+a, b+a+a+b, b+a+b+a, b+b+a+a 2a 2b
// a+b+b+b, b+a+b+b, b+b+a+b, b+b+b+a 1a 3b
// b+b+b+b 4b

// a+a+a+a+a 5a 0b
// a+a+a+a+b, a+a+a+b+a, a+a+b+a+a, a+b+a+a+a, b+a+a+a+a+a 4a 1b
// a+a+a+b+b, a+a+b+a+b, a+a+b+b+a, a+b+a+a+b, a+b+a+b+a, a+b+b+a+a, b+a+a+a+b, b+a+a+b+a, b+a+b+a+a, b+b+a+a+a 3a 2b
// a+a+b+b+b, a+b+a+b+b 2a 3b
// a+b+b+b+b 1a 4b
// b+b+b+b+b 0a 5b
function processData(n, a, b){
  var ans = [];
  for(var i = 0; i < n + 1; i++){
    aa = a * (n-i);
    bb = b * (i);
    ans.push(aa + bb)
  }
  ans.sort(function(a, b){return a - b});
  return ans;
}

console.log(processData(3, 1, 2));
&#13;
&#13;
&#13;