Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数内JavaScript函数调用的更快算法_Javascript_Algorithm_Recursion - Fatal编程技术网

函数内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算法的一个实现。我不确定要在他的答案中添加什么。