【问题标题】:Optimizing solution of Sum of Pairs: Codewars对和的优化解决方案:Codewars
【发布时间】:2017-07-05 08:36:04
【问题描述】:

我需要帮助来优化问题的解决方案,我已经解决了问题,但是我的代码不足以处理大型数组 - codeWars : Sum of Pairs - problem

这是我的代码 -

var sum_pairs=function(e, sum){

var result=null;
var arrLen=e.length;
for(let i=0;i<arrLen-1;i++){
  let nextIndex=e.slice(i+1,arrLen).indexOf(sum-e[i]);
  if(nextIndex>=0){ 
    result=[e[i],e[nextIndex+1+i]];
    arrLen=nextIndex+1+i; 
  }
}
return result;
}

好吧,我知道这不是一个好的解决方案。无论如何,这通过了所有测试用例,但在遇到大数组时失败了 - Result On codewars

我想知道如何优化这段代码,也想学习任何技术来编写一个好的代码。

【问题讨论】:

  • Here is link - 用那个(train/ 部分或不)替换您问​​题中的图像参考。)问题定义不明确:什么是出现顺序的定义,什么时候是一对更早?如果它是最低索引优先,您只需要知道在不同索引处是否有一个与给定总和相加的值。如果它指数总和最低,打破平局的指数最低,你需要变得更聪明……(请注意,欢迎你回答你自己的问题。)
  • I want to know how to optimise this code - 不要 - 该算法无法处理相当大的数组。 I want to [… learn] any technique [for writing] good code你从最简单的可能工作开始:很好。您将每个索引视为可能的第一个索引 - 看起来不可避免。暂时不考虑 ECMAScript slice 的复杂性:使用indexOf(sum-e[i]) 的每个会员查询 需要付出多少努力?全力以赴?所需的结果是什么,一旦找到匹配对,您的 sum_pairs 会做什么? (想象一个由 10,000,000 个零组成的数组,总和为零)
  • @greybeard 你的意思是说let nextIndex=e.slice(i+1,arrLen).indexOf(sum-e[i]);这条线需要更多时间,
  • 我完全期望array.indexOf(value) 花费时间与array 的元素数/_length_ 成线性关系(在不成功的搜索中)。 more time什么 相比?除了在知道结果的那一刻不要停止之外,这绝对是很多时间的去向。

标签: javascript arrays algorithm memoization


【解决方案1】:

一种解决方案是使用Set 数据结构来记住所有准备好迭代的数字。然后我们可以检查每个元素是否有一个总和为s 的数字。该集合具有平均恒定的插入和搜索时间复杂度,使算法在时间(和空间)上呈线性。

var sum_pairs=function(ints, s){
  if (ints.length < 2) return undefined; //not enough numbers for pair.
  let intSet = new Set()
  intSet.add(ints[0]);
  for (let i=1; i < ints.length; ++i){
    let needed = s-ints[i];
    if (intSet.has(needed)){//check if we have already seen the number needed to complete the pair.
      return [needed,ints[i]];
    }
    intSet.add(ints[i]);//if not insert the number in set and continue.
  }
  return undefined;//No answer found
}

【讨论】:

  • 第三个例子返回了什么:sum_pairs([10, 5, 2, 3, 7, 5], 10)?
  • 它确实通过了 codeWars 的所有测试,所以我假设 [3,7].
  • 太棒了,使用set 是个好主意,谢谢:)。
  • 很好的答案。顺便说一句,在这种情况下使用Set 更有意义(因为它避免了重复),我尝试使用一个很好的旧Object,它也能正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多