【发布时间】: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你从最简单的可能工作开始:很好。您将每个索引视为可能的第一个索引 - 看起来不可避免。暂时不考虑 ECMAScriptslice的复杂性:使用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