函数内JavaScript函数调用的更快算法
我已经编写了一个函数并在其中调用了另一个函数,但测试表明它没有时间优化。如何使以下代码更快函数内JavaScript函数调用的更快算法,javascript,algorithm,recursion,Javascript,Algorithm,Recursion,我已经编写了一个函数并在其中调用了另一个函数,但测试表明它没有时间优化。如何使以下代码更快 function maxSum(arr, range) { function sumAll(array1, myrange) { var total = 0; if (Array.isArray(myrange)) { for (var i = myrange[0]; i <= myran
function maxSum(arr, range) {
function sumAll(array1, myrange) {
var total = 0;
if (Array.isArray(myrange)) {
for (var i = myrange[0]; i <= myrange[1]; i++) {
total += array1[i];
}
return total;
} else return array1[myrange];
}
var mylist = [];
var l = range.length;
for (var n = 0; n < l; n++) {
mylist.push(sumAll(arr, range[n]));
}
return Math.max.apply(null, mylist);
}
函数最大和(arr,范围){
函数sumAll(数组1,myrange){
var合计=0;
if(Array.isArray(myrange)){
对于(var i=myrange[0];i1),可以在函数maxSum
之外定义函数sumAll
,因为每次调用maxSum
时,javascript引擎都会重新创建一个新函数sumAll
2) 您可以将myrange[1]
定义为初始化器部分中的变量,以避免javascript在每次迭代时查找myrange[1]
for (var i = myrange[0]; i <= myrange[1]; i++) {
total += array1[i];
}
for(var i=myrange[0];i1)可以在函数maxSum
之外定义函数sumAll
,因为每次调用maxSum
时,javascript引擎都在重新创建一个新函数sumAll
2) 您可以将myrange[1]
定义为初始化器部分中的变量,以避免javascript在每次迭代时查找myrange[1]
for (var i = myrange[0]; i <= myrange[1]; i++) {
total += array1[i];
}
for(var i=myrange[0];i算法优化:使用从索引0到每个索引的累积和创建新数组
cumsum[0] = 0;
for (var i = 1; i <= arr.Length; i++) {
cumsum[i] = cumsum[i-1] + arr[i-1]
用你的话来说:
function sumAll(array1, myrange) {
return cumsum[myrange[1]+1] - cumsum[myrange[0]];
}
例如:
arr = [1,2,3,4]
cumsum = [0,1,3,6,10]
sum for range 1..2 = 6 - 1 = 5
如果您的数组可能被更新,请考虑数据结构算法优化:创建从索引0累积到每个索引的新数组。
cumsum[0] = 0;
for (var i = 1; i <= arr.Length; i++) {
cumsum[i] = cumsum[i-1] + arr[i-1]
用你的话来说:
function sumAll(array1, myrange) {
return cumsum[myrange[1]+1] - cumsum[myrange[0]];
}
例如:
arr = [1,2,3,4]
cumsum = [0,1,3,6,10]
sum for range 1..2 = 6 - 1 = 5
如果您的数组可能被更新,请考虑基于@姆博最优优化的数据结构全工作代码。这将通过所有的测试,我收集的是这个问题来自哪里。
function maxSum(arr, ranges) {
var max = null;
var sums = [];
var sofar = 0;
for (var i = 0; i <= arr.length; i++) {
sums[i] = sofar;
sofar += arr[i];
}
for (var i = 0; i < ranges.length; i++) {
var sum = sums[ranges[i][1]+1] - sums[ranges[i][0]];
if (max === null || sum > max) {
max = sum;
}
}
return max;
}
函数最大和(arr,范围){
var max=null;
var总和=[];
var-sofar=0;
对于(变量i=0;i最大值){
最大值=总和;
}
}
返回最大值;
}
基于@MBo出色优化的完整工作代码。它通过了所有的测试,我想这就是问题的根源所在
function maxSum(arr, ranges) {
var max = null;
var sums = [];
var sofar = 0;
for (var i = 0; i <= arr.length; i++) {
sums[i] = sofar;
sofar += arr[i];
}
for (var i = 0; i < ranges.length; i++) {
var sum = sums[ranges[i][1]+1] - sums[ranges[i][0]];
if (max === null || sum > max) {
max = sum;
}
}
return max;
}
函数最大和(arr,范围){
var max=null;
var总和=[];
var-sofar=0;
对于(变量i=0;i最大值){
最大值=总和;
}
}
返回最大值;
}
请同时添加函数的调用。我正在第二个forloop中调用第二个函数“sumAll”。请注意,但是如何调用maxSum()
?函数调用使用什么数据?maxSum([1,2,3,4,5,6,7,8],[1,7],[0,2],[3,4],7]);请同时添加函数的调用。我正在调用第二个函数“sumAll”在第二个forloop中。查看keenlyYes,但是如何调用maxSum()
?函数调用使用什么数据?maxSum([1,2,3,4,5,6,7,8],[1,7],[0,2],[3,4,7]);我认为这会有所不同,但还不足以让我提交它。删除一个函数会让它更快。@NBeydonI不太了解算法本身,你有一些输入和相应的输出吗?我认为这会有所不同,但还不足以让我提交它。删除一个函数会让它快得多。@NBeydonI不太了解算法本身,你有一些输入和相应的输出吗?请解释一下你在{sum for range(i..j)=cumsum[j+1]-cumsum[i];}上做了什么@Hoslack它是你函数sumAll的替代品。我更新了答案,试图实现它。请解释一下你在{sum for range(I..j)=cumsum[j+1]-cumsum[I];}上做了什么@Hoslack它是你的函数sumAll的替代品。我更新了答案,并试图实现它。我对答案的兴趣不如对工作算法的兴趣。请解释代码的作用。@smarxIt只是@MBo所描述的算法的一个实现。我不确定给他的答案添加什么。我对答案不感兴趣因为我在使用算法。请解释代码的作用。@smarxIt只是所描述的@MBo算法的一个实现。我不确定要在他的答案中添加什么。