【问题标题】:Unique Permutations of Summing Pairs: Javascript Algorithm求和对的独特排列:Javascript 算法
【发布时间】:2016-01-28 05:57:09
【问题描述】:

我完成了一个低效但有效的算法来计算数组(arr1) 中的哪一对数字加起来就是总和。我面临这两个问题:

(1) 它给了我“每一对”(例如 1+11 以及总和为 12 时的 11+1),

(2) 我不希望它给自己添加一个数字(例如findArrSum([1, 3, 4, 8, 9, 11, 6, ], 12)我不希望它返回 (6+6))。我可以通过我的 if 语句忽略 6,但在这种情况下,它也会忽略解决方案(本例中为 6+6 findArrSum([1, 3, 4, 8, 9, 11, 6, 6], 12)

function findArrSum(arr1, sum) {   
  var i = 0;

  for (i in arr1) {
      arr1.map(function(num) {

       var answerSum = (num + arr1[i]);
       if (answerSum == sum && num != arr1[i]) {

                console.log(num +"+" +arr1[i] +"=" +sum);


                }
        });
    }
}
console.log('Enter an array and a sum that you want a pair to add to: ')

【问题讨论】:

标签: javascript arrays algorithm


【解决方案1】:

一个简单的算法应该是

function findArrSum(arr, sum) {
  for(var i=0; i<arr.length; ++i)
    for(var j=i+1; j<arr.length; ++j)
      if(arr[i] + arr[j] === sum)
        console.log(arr[i] + ' + ' + arr[j] + ' = ' + sum);
}

但这要花费n^2。我们可以通过先排序,然后使用二分搜索来做得更好

function dicSearch(arr, item, from, to) {
  if(from === to) return -1;
  var mid = Math.floor((from + to) / 2);
  if(arr[mid] > item) return dicSearch(arr, item, from, mid);
  if(arr[mid] < item) return dicSearch(arr, item, mid+1, to);
  return mid;
}
function findArrSum(arr, sum) {
  arr.sort(function(a,b) {
    return a-b;
  });
  for(var i=0; i<arr.length; ++i) {
    var j = dicSearch(arr, sum-arr[i], i+1, arr.length);
    if(j >= 0)
      console.log(arr[i] + ' + ' + arr[j] + ' = ' + sum);
  }
}

这应该只花费n log n。您甚至可以通过在达到找到的最小值 j 而不是达到 arr.length 时停止迭代来加快速度。

但我们可以通过使用哈希来更快地做到这一点。

function findArrSum(arr, sum) {
  var hash = Object.create(null); // Also consider ES6 map
  for(var i=0; i<arr.length; ++i) {
    var j = hash[arr[i]];
    if(j != null)
      console.log(arr[i] + ' + ' + arr[j] + ' = ' + sum);
    hash[sum-arr[i]] = i;
  }
}

平均只需n

【讨论】:

  • 修复了问题和整体效率低下的问题。真的不知道如何为 javascript 使用哈希。
【解决方案2】:

你的两个问题都可以通过像这样的小改动来解决

function findArrSum(arr1, sum) {   
  var i = 0;
  var usedSumArray = []; //new array introduced to store already done sums
  for (i in arr1) {
      arr1.map(function(num) {
       var thisSum = num +"+" +arr1[i]; //storing sum string
       if ( num != arr1[i] && usedSumArray.indexOf( thisSum ) == -1 ) //checking if the number is same or sum already done
       {
          usedSumArray.push( thisSum );
          var answerSum = (num + arr1[i]);
          if (answerSum == sum && num != arr1[i]) 
         {
            console.log(num +"+" +arr1[i] +"=" +sum);
         }
       }
     });
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2017-12-13
    • 1970-01-01
    • 2017-01-17
    • 2010-09-22
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多